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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top