Come mettere a nudo codici colore utilizzati dagli utenti mIRC?
Domanda
Sto scrivendo un bot IRC in Python utilizzando irclib e sto cercando di registrare i messaggi su alcuni canali.
Il problema è che alcuni utenti mIRC e alcuni bot scrivere con le codici colore .
Qualche idea su come ho potuto spogliare quelle parti e lasciare solo il messaggio di testo ASCII chiaro?
Soluzione
Le espressioni regolari sono la soluzione più pulita a mio parere. Se non li avete utilizzato prima, questo è una buona risorsa. Per i dettagli completi su libreria regex di Python, andare qui .
import re
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
Le ricerche regex per ^ C (che è \ x03 in ASCII , è possibile confermare con 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 un altro uno 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 partita 0 o 1 e {n, m} mezzi per abbinare n per m del gruppo precedente. Infine, \ d significa per abbinare [0-9].
Il resto può essere decodificato usando i link rimando sopra.
>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'
chaos ' 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 il comando colore)
Altri suggerimenti
Il secondo-valutato e suggerimenti che seguono sono difettosi, come sembrano per cifre dopo qualunque personaggio, ma non dopo il carattere codice di colore.
Ho migliorato e combinato tutti i messaggi, con le seguenti conseguenze:
- abbiamo do rimuovere il carattere di rovescio
- rimuovere i codici di colore senza lasciando cifre nel testo.
Soluzione:
regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)
Come ho trovato questa domanda utile, ho pensato di contribuire.
Ho aggiunto un paio di cose per l'espressione regolare
regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
\x16
rimosso il carattere "inversa". \x0f
si libera di un altro personaggio in grassetto.
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
Ho anche dovuto aggiungere '\x0f
', qualunque sia l'uso che ha
regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
regex.sub('', msg)
Lo so che ho postato che vogliono una 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.