J'écris un bot IRC en Python en utilisant irclib et j'essaye d'enregistrer les messages sur certains canaux.
Le problème est que certains utilisateurs de mIRC et certains Bots écrivent en utilisant color codes.
Une idée sur la façon dont je pourrais dépouiller ces parties et ne laisser que le message texte ascii clair?Comment supprimer les codes couleur utilisés par les utilisateurs de mIRC?
Répondre
Les expressions régulières sont votre pari le plus propre à mon avis. Si vous ne les avez pas déjà utilisés, this est une bonne ressource. Pour tous les détails sur la bibliothèque regex de Python, rendez-vous au here.
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 en faisant chr (3) sur la ligne de commande), puis regarde en option pour un ou deux [0-9] caractères , suivi éventuellement d'une virgule suivie d'un ou deux autres caractères [0-9].
(? ...) 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 correspondre 0 ou 1 et {n, m} signifie correspondre n à m du regroupement précédent. Enfin, \ d signifie correspondre [0-9].
Le reste peut être décodé en utilisant les liens auxquels je me réfère ci-dessus.
>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'
solution chaos '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 couleur)
Parfait, merci. Bonne réponse et bonne explication. J'ai ajouté \ x1f | \ x02 | de sorte qu'il serait également filtrer gras et souligner. re.compile ("\ x1f | \ x02 | \ x03 (?: \ d {1,2} (?:, \ d {1,2})?)?", re.UNICODE) – daniels
p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)
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)
Comme je l'ai trouvé cette question utile, je me suis dit que je cotise.
J'ai ajouté une couple de choses à la regex
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.
Les suggestions suivantes et les suivantes sont défectueuses, car elles recherchent des chiffres après tout caractère, mais pas après le caractère de code de couleur.
je me suis amélioré et combiné tous les postes, avec les conséquences suivantes:
- nous faire supprimer le caractère inverse
- supprimer les codes couleurs sans chiffres laissant dans le texte.
Solution:
regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
AutoDL-irssi avait un très bon é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
Je sais que je posté vouloir un solution regex car elle 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 à tous.
Régler le canal + S: P – Eevee