Comment enlever les codes de couleur utilisés par les utilisateurs mIRC?

StackOverflow https://stackoverflow.com/questions/970545

  •  13-09-2019
  •  | 
  •  

Question

J'écris un bot IRC en Python en utilisant irclib et je suis en train d'enregistrer les messages sur certains canaux.
Le problème est que certains utilisateurs mIRC et certains bots écrire en utilisant codes de couleur .
Toute idée sur la façon dont je pourrais dépouiller les parties et ne laisser que le message texte ascii clair?

Était-ce utile?

La solution

Les expressions régulières sont votre pari propre à mon avis. Si vous ne les avez pas utilisé auparavant, cette est une bonne ressource. Pour tous les détails sur la bibliothèque regex de Python, allez .

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

Les recherches regex pour ^ C (qui est \ x03 dans ASCII , vous pouvez confirmer par faire chr (3) sur la ligne de commande), puis attend éventuellement un ou deux [0-9] caractères, puis éventuellement suivie d'une virgule, puis un autre une ou deux [0-9] caractères.

(?: ...) dit d'oublier le stockage ce qui a été trouvé dans la parenthèse (comme nous ne devons il référence arrière), ? signifie à match de 0 ou 1 et {n, m} signifie pour correspondre à n m du groupement précédent. Enfin, \ d signifie pour correspondre à [0-9].

Le reste peut être décodé en utilisant les liens ci-dessus je me réfère.

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

chaos » solution est similaire, mais peut finir par manger plus d'un maximum de deux nombres et pas non plus supprimer tous les caractères en vrac ^ C qui peuvent être suspendus au sujet (comme celui qui ferme la commande de la couleur)

Autres conseils

La deuxième cotés et suggestions suivantes sont défectueux, car ils recherchent des chiffres après quelque nature qu'elles soient, mais pas après le caractère de code couleur.

Je me suis amélioré et combiné tous les postes, avec les conséquences suivantes:

  • nous ne supprimer le caractère inverse
  • supprimer les codes de couleur sans en laissant les chiffres dans le texte.

Solution:

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)

Comme je l'ai trouvé cette question utile, je pensais que je serais verser des cotisations.

J'ai ajouté une ou deux choses à l'expression rationnelle

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

\x16 supprimé le caractère "inverse". \x0f se débarrasse d'un autre caractère gras.

AutoDL-irssi avait une très bonne écrit en Perl, ici il est en 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

J'ai même dû ajouter « \x0f », quelle que soit l'utilisation qu'il a

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

Je sais que je posté une solution de vouloir regex car il pourrait être plus propre, j'ai créé une solution non regex qui fonctionne parfaitement.

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

Merci pour toute l'aide tout le monde.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top