2009-06-09 10 views

Antwort

12

Reguläre Ausdrücke sind meiner Meinung nach die sauberste Wette. Wenn Sie sie vorher nicht benutzt haben, ist this eine gute Ressource. Die vollständigen Details zu Pythons Regex-Bibliothek finden Sie unter here.

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

Die Regex sucht^C, und dann sieht optional ein oder zwei [0-9] Zeichen (die in ASCII \ x03 ist, Sie chr, indem Sie (3) auf der Kommandozeile kann bestätigen) , dann optional gefolgt von einem Komma und dann noch ein oder zwei [0-9] Zeichen.

(?: ...) sagt über das Speichern von vergessen, was in der Klammer gefunden wurde (wie wir müssen es nicht Rückreferenzierung), ? bedeutet, dass 0 oder 1 und übereinstimmen {n, m} bedeutet, dass n zu m der vorherigen Gruppierung passt. Schließlich bedeutet \ d die Übereinstimmung [0-9].

Der Rest kann über die Links entschlüsselt werden, auf die ich oben verwiesen habe.

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

Chaos "Lösung ist ähnlich, jedoch kann am Ende mehr als ein Maximum von zwei Zahlen zu essen und werden auch alle losen^C Zeichen nicht entfernen, die über hängen kann (wie beispielsweise derjenige, der die verschließt Farbbefehl)

+0

Perfekt, danke. Schöne Antwort und großartige Erklärung. Ich habe \ x1f | \ x02 | hinzugefügt so dass es auch fett und unterstrichen filtern würde. 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

ich sogar ‚\x0f‘ hatte hinzuzufügen, welchen Gebrauch es

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

hat wie ich diese Frage nützlich gefunden, ich dachte, ich beitragen würde.

Ich habe ein paar Dinge auf die regex

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

\x16 die "reverse" Zeichen entfernt. \x0f wird ein weiteres fettes Zeichen los.

7

Die zweitklassigen und folgenden Vorschläge sind fehlerhaft, da sie nach jedem Zeichen, aber nicht nach dem Farbcode nach Ziffern suchen.

Ich habe verbessert und alle Beiträge kombiniert mit folgenden Konsequenzen:

  • wir tun den umgekehrten Zeichen
  • entfernen Farbcodes ohne verlassen Stellen im Text entfernen.

Lösung:

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

1

AutoDL-irssi ein sehr gutes in Perl geschrieben hatte, hier ist es in 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

Ich weiß, dass ich gepostet ein Wunsch Regex-Lösung, weil es sauberer sein könnte, habe ich eine non-Regex-Lösung erstellt, die perfekt funktioniert.

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)) 

Vielen Dank für die Hilfe allen.

Verwandte Themen