Sto scrivendo un bot IRC in Python usando irclib e sto provando a registrare i messaggi su determinati canali.
Il problema è che alcuni utenti di mIRC e alcuni robot scrivono utilizzando color codes.
Qualche idea su come potrei spogliare quelle parti e lasciare solo il chiaro messaggio di testo ascii?Come rimuovere i codici colore utilizzati dagli utenti di mIRC?
risposta
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)
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
p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)
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)
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.
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)
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
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.
Impostare il canale + S: P – Eevee