Farbescape-Sequenzen aus Strings entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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...)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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:
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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:
Antworten