2009-06-09 2 views

risposta

12

Le espressioni regolari sono la tua scommessa più pulita a mio parere. Se non li hai mai usati prima, lo this è una buona risorsa. Per i dettagli completi sulla libreria regex di Python, vai su here.

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

Le ricerche regex per^C (che è \ x03 in ASCII, si può confermare facendo chr (3) sulla riga di comando), e poi guarda a scelta per uno o due [0-9] caratteri , quindi opzionalmente seguito da una virgola e poi da un altro o due [0-9] caratteri.

(:? ...) dice di dimenticare la memorizzazione di ciò che è stato trovato in parentesi (come noi non abbiamo bisogno di backreference esso), ? significa corrispondere a 0 o 1 e {n, m} significa corrispondere da n a m del raggruppamento precedente. Infine, \ d significa abbinare [0-9].

Il resto può essere decodificato utilizzando i collegamenti a cui mi riferisco sopra.

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

caos 'soluzione è simile, ma può finire mangiare più di un massimo di due numeri e inoltre non rimuovere eventuali caratteri sciolti^C che possono essere appesi circa (come quella che chiude la comando di colore)

+0

Perfetto, grazie. Bella risposta e grande spiegazione. Ho aggiunto \ x1f | \ x02 | in modo tale da filtrare anche in grassetto e sottolineato. 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

ho anche dovuto aggiungere '\x0f', qualunque sia l'uso ha

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

Come ho trovato questa domanda utile, ho pensato di contribuire.

ho aggiunto un paio di cose da l'espressione regolare

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

\x16 rimosso il carattere "reverse". \x0f elimina un altro carattere grassetto.

7

I suggerimenti second-rated e seguenti sono difettosi, poiché cercano le cifre dopo qualsiasi carattere, ma non dopo il carattere del codice colore.

Ho migliorato e combinato tutti i messaggi, con le seguenti conseguenze:

  • abbiamo fare rimuovere il carattere di rovescio
  • codici colore rimuovere senza cifre che lasciano nel testo.

Soluzione:

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

1

AutoDL-irssi ha avuto un ottimo uno scritto in Perl, qui è 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

So che ho postato che vogliono un soluzione regex perché potrebbe essere più pulito, ho creato una soluzione non regex che funziona perfettamente.

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

Grazie per tutto l'aiuto di tutti.