Seite 1 von 1

Farbescape-Sequenzen aus Strings entfernen

Verfasst: Freitag 22. September 2006, 14:37
von Rebecca
Ich habe Strings vorliegen, in denen Escape-Sequencen fuer die Schriftfarbe vorkommen. Die Farbe soll aber raus. Beispiel:

Code: Alles auswählen

>>> a = ... #irgendein string
>>> repr(a)
"'\\x1b[46;1;31mHallo\\nWelt\\x1b[0m'"
>>> magische umwandlung
>>> repr(a) 
"'Hallo\\nWelt'"
Ich bekomme es zwar hin, aber total kompliziert: Auf repr(a) ein re.sub anwenden:

Code: Alles auswählen

>>> a = re.sub(r"\\((033)|(x1b))\[.*?m", "", repr(a))
>>> repr(a)
'"\'Hallo\\\\nWelt\'"'
Dann die zerstoerten Escape-Sequencen \n, \r etc. wieder reparieren und schlussendlich noch die ueberfluessigen ' von repr wieder entfernen.

Jetzt frag ich mich, ob das auch irgendwie einfacher geht? Sehe ich vielleicht gerade den Wald vor lauter Baeumen nicht? (Ich glaube, ich werde heute nacht von Backslashes traeumen, so lange starr ich schon auf diese daemlichen Strings...)

Verfasst: Freitag 22. September 2006, 14:54
von rayo
Hi

repr zeigt nur nicht darstellbare Zeichen mit \x.. an. Du kannst diese direkt ersetzen, dann siehts so aus:

Code: Alles auswählen

re.sub("(\x1b)\\[.*?m", "", a) # doppelter Backslash damit für re ein backslash vor der eckigen Klammer steh
order als raw-string

Code: Alles auswählen

re.sub(r"(%s)\[.*?m" % "\x1b", "", a) # mit formatstring weil in einem Raw-String man keine escapten Daten eingeben kann
Gruss

Verfasst: Freitag 22. September 2006, 15:16
von Rebecca
Cool! 8)

Code: Alles auswählen

>>> a = "\033[46;1;31mHallo\nWelt\033[0m"
>>> c = "\x1b[46;1;31mHallo\nWelt\x1b[0m"
>>> print re.sub("((\x1b)|(\033)|(\e))\\[.*?m", "", a)
Hallo
Welt
>>> print re.sub("((\x1b)|(\033)|(\e))\\[.*?m", "", c)
Hallo
Welt

Irgendwie war ich zu dem Schluss gekommen, dass es nicht direkt geht, aber meine RegExp war halt bloed. Jetzt sehe ich den Fehler.

Danke!!! Ich hab da schon ewig dran rumgebastelt! :lol:

Verfasst: Freitag 22. September 2006, 15:22
von rayo
Hi

Noch eine kleine Anmerkung 0x1B und Oktal 033 ist dasselbe. Kannst alsi weglassen.

Und was ist \e? Kann also ein Farbcode auch mit \e anfangen? (2 Zeichen, ein Backslash und ein e)

Gruss

Verfasst: Freitag 22. September 2006, 15:33
von Rebecca
Okay, ich mach jetzt echt Feierabend, bevor ich noch mehr Bloedsinn verzapfe. Natuerlich haste Recht mit 0x1B und 033. :oops: Und das mit dem \e: Die Bash akzeptiert das als Eingabe, ist dann aequivalent zu \033. Aber Python erkennt das nicht als Escape-Sequenz. Und eigentlich sollte das \e in meinem letzen Post nicht mehr vorkommen.

So, schoenes Wochenende allerseits! Ich glaub, ich hab's echt noetig... :wink: