Ich schreibe einen IRC-Bot in Python mit irclib und ich versuche, die Nachrichten auf bestimmten Kanälen zu protokollieren. Das Problem ist, dass einige mIRC-Benutzer und einige Bots mit color codes schreiben.
Irgendeine Idee, wie ich diese Teile abstreifen könnte und nur die klare ascii Textnachricht lassen?Wie streichen Sie Farbcodes, die von mIRC-Benutzern verwendet werden?
Antwort
Reguläre Ausdrücke sind meiner Meinung nach die sauberste Wette. Wenn Sie sie vorher nicht benutzt haben, ist this eine gute Ressource. Die vollständigen Details zu Pythons Regex-Bibliothek finden Sie unter here.
import re
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
Die Regex sucht^C, und dann sieht optional ein oder zwei [0-9] Zeichen (die in ASCII \ x03 ist, Sie chr, indem Sie (3) auf der Kommandozeile kann bestätigen) , dann optional gefolgt von einem Komma und dann noch ein oder zwei [0-9] Zeichen.
(?: ...) sagt über das Speichern von vergessen, was in der Klammer gefunden wurde (wie wir müssen es nicht Rückreferenzierung), ? bedeutet, dass 0 oder 1 und übereinstimmen {n, m} bedeutet, dass n zu m der vorherigen Gruppierung passt. Schließlich bedeutet \ d die Übereinstimmung [0-9].
Der Rest kann über die Links entschlüsselt werden, auf die ich oben verwiesen habe.
>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'
Chaos "Lösung ist ähnlich, jedoch kann am Ende mehr als ein Maximum von zwei Zahlen zu essen und werden auch alle losen^C Zeichen nicht entfernen, die über hängen kann (wie beispielsweise derjenige, der die verschließt Farbbefehl)
Perfekt, danke. Schöne Antwort und großartige Erklärung. Ich habe \ x1f | \ x02 | hinzugefügt so dass es auch fett und unterstrichen filtern würde. re.compile ("\ x1f | \ x02 | \ x03 (?: \ d {1,2} (?:, \ d {1,2})?)?", re.UNICODE) – daniels
p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)
ich sogar ‚\x0f
‘ hatte hinzuzufügen, welchen Gebrauch es
regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
regex.sub('', msg)
hat wie ich diese Frage nützlich gefunden, ich dachte, ich beitragen würde.
Ich habe ein paar Dinge auf die regex
regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
\x16
die "reverse" Zeichen entfernt. \x0f
wird ein weiteres fettes Zeichen los.
Die zweitklassigen und folgenden Vorschläge sind fehlerhaft, da sie nach jedem Zeichen, aber nicht nach dem Farbcode nach Ziffern suchen.
Ich habe verbessert und alle Beiträge kombiniert mit folgenden Konsequenzen:
- wir tun den umgekehrten Zeichen
- entfernen Farbcodes ohne verlassen Stellen im Text entfernen.
Lösung:
regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
AutoDL-irssi ein sehr gutes in Perl geschrieben hatte, hier ist es 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
Ich weiß, dass ich gepostet ein Wunsch Regex-Lösung, weil es sauberer sein könnte, habe ich eine non-Regex-Lösung erstellt, die perfekt funktioniert.
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))
Vielen Dank für die Hilfe allen.
- 1. Html-Farbcodes werden nicht richtig angezeigt?
- 2. Wie neu zu streichen, nachdem Sie blättern?
- 3. Verwendung von Farbcodes in HTML
- 4. WPF DataGrid, streichen Sie die Zeile
- 5. Finden Sie Methoden, die einmal verwendet werden
- 6. Wie werden die tatsächlichen MAVEN_OPTIONS gedruckt, die verwendet werden?
- 7. Wie Freigabe von Ressourcen, die von HttpPostedFileBase verwendet werden?
- 8. aus streichen Rekord wie
- 9. Erläutern Sie die Synchronisierung von Sammlungen, wenn Iteratoren verwendet werden?
- 10. Wie häufig werden die Xilinx-Chips verwendet?
- 11. Farbcodes und String-Interpolation
- 12. Wie kann die clojure.algo.generic-Bibliothek verwendet werden?
- 13. Wie wird JList neu streichen?
- 14. Netbeans-Versionskontrolldatei-Farbcodes?
- 15. Tortoise SVN Diff Farbcodes
- 16. So ändern Sie die Aktivität mit Streichen nach links/rechts
- 17. Vergrößern Sie die Seiten nach jedem Streichen Objective-C
- 18. Wie werden Anzeigenereignisse verwendet?
- 19. Ein QChart neu streichen
- 20. Bash - Get Teilstring mit Farbcodes
- 21. , wie Farbcodes für verschiedene Themen von einem einzigen Basisthema ändern
- 22. Wie validieren Sie die Korrektheit von Funktionen, die zufällig verwendet werden?
- 23. Möchten Sie die Schaltfläche zum Löschen von rechts nach links streichen in UITableView
- 24. Wie werden die Funktionen von EcmaScript 6 in Ionic verwendet?
- 25. Wie kann die Erkennung von Containerüberlauffehlern in GCC verwendet werden?
- 26. Ändern der Opazität von UIView durch Streichen
- 27. JFrame Titel neu streichen
- 28. Wie osgi Bundles von Schlingen verwendet werden
- 29. Wie werden Parse-Bäume verwendet?
- 30. Wie registrieren Sie DapperExtension ClassMapper-Unterklassen, damit sie verwendet werden?
Legen Sie den Kanal + S: P – Eevee