2009-06-09 4 views

Répondre

12

Les expressions régulières sont votre pari le plus propre à mon avis. Si vous ne les avez pas déjà utilisés, this est une bonne ressource. Pour tous les détails sur la bibliothèque regex de Python, rendez-vous au here.

import re 
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 

Les recherches regex pour^C (qui est \ x03 dans ASCII, vous pouvez confirmer en faisant chr (3) sur la ligne de commande), puis regarde en option pour un ou deux [0-9] caractères , suivi éventuellement d'une virgule suivie d'un ou deux autres caractères [0-9].

(? ...) dit d'oublier le stockage ce qui a été trouvé dans la parenthèse (comme nous ne devons il référence arrière), ? signifie correspondre 0 ou 1 et {n, m} signifie correspondre n à m du regroupement précédent. Enfin, \ d signifie correspondre [0-9].

Le reste peut être décodé en utilisant les liens auxquels je me réfère ci-dessus.

>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla") 
'blabla to be colored text and background blabla' 

solution chaos 'est similaire, mais peut finir par manger plus d'un maximum de deux nombres et pas non plus supprimer tous les caractères en vrac^C qui peuvent être suspendus au sujet (comme celui qui ferme la commande de couleur)

+0

Parfait, merci. Bonne réponse et bonne explication. J'ai ajouté \ x1f | \ x02 | de sorte qu'il serait également filtrer gras et souligner. re.compile ("\ x1f | \ x02 | \ x03 (?: \ d {1,2} (?:, \ d {1,2})?)?", re.UNICODE) – daniels

1
p = re.compile("\x03\d+(?:,\d+)?") 
p.sub('', text) 
0

J'ai même dû ajouter « \x0f », quelle que soit l'utilisation qu'il a

regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 
regex.sub('', msg) 
1

Comme je l'ai trouvé cette question utile, je me suis dit que je cotise.

J'ai ajouté une couple de choses à la regex

regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 

\x16 supprimé le caractère "inverse". \x0f se débarrasse d'un autre caractère gras.

7

Les suggestions suivantes et les suivantes sont défectueuses, car elles recherchent des chiffres après tout caractère, mais pas après le caractère de code de couleur.

je me suis amélioré et combiné tous les postes, avec les conséquences suivantes:

  • nous faire supprimer le caractère inverse
  • supprimer les codes couleurs sans chiffres laissant dans le texte.

Solution:

regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

1

AutoDL-irssi avait un très bon écrit en Perl, ici il est en python:

def stripMircColorCodes(line) : line = re.sub("\x03\d\d?,\d\d?","",line) line = re.sub("\x03\d\d?","",line) line = re.sub("[\x01-\x1F]","",line) return line

0

Je sais que je posté vouloir un solution regex car elle pourrait être plus propre, j'ai créé une solution non regex qui fonctionne parfaitement.

def colourstrip(data): 
    find = data.find('\x03') 
    while find > -1: 
     done = False 
     data = data[0:find] + data[find+1:] 
     if len(data) <= find+1: 
      done = True 
     try: 
      assert int(data[find]) 
      data = data[0:find] + data[find+1:] 
     except: 
      done = True 
     try: 
      assert not done 
      assert int(data[find]) 
      data = data[0:find] + data[find+1:] 
     except: 
      if not done and (data[find] != ','): 
       done = True 
     if (len(data) > find+1) and (data[find] == ','): 
      try: 
       assert not done 
       assert int(data[find+1]) 
       data = data[0:find] + data[find+1:] 
       data = data[0:find] + data[find+1:] 
      except: 
       done = True 
      try: 
       assert not done 
       assert int(data[find]) 
       data = data[0:find] + data[find+1:] 
      except: pass 

     find = data.find('\x03') 
    data = data.replace('\x1d','') 
    data = data.replace('\x1f','') 
    data = data.replace('\x16','') 
    data = data.replace('\x0f','') 
    return data 

datastring = '\x0312,4This is coolour \x032,4This is too\x03'  
print(colourstrip(datastring)) 

Merci pour toute l'aide à tous.

Questions connexes