Löschen Sie sie mit einem regulären Ausdruck:
import re
ansi_escape = re.compile(r'''
\x1B # ESC
(?: # 7-bit C1 Fe (except CSI)
[@-Z\\-_]
| # or [ for CSI, followed by a control sequence
\[
[0-?]* # Parameter bytes
[ -/]* # Intermediate bytes
[@-~] # Final byte
)
''', re.VERBOSE)
result = ansi_escape.sub('', sometext)
oder ohne VERBOSE
Flagge in komprimierter Form:
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
result = ansi_escape.sub('', sometext)
Demo:
>>> import re
>>> ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
>>> sometext = 'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'
>>> ansi_escape.sub('', sometext)
'ls\r\nexamplefile.zip\r\n'
Der obige reguläre Ausdruck deckt alle 7-Bit-ANSI-C1-Escape-Sequenzen ab, nicht jedoch die 8-Bit-C1-Escape-Sequenzöffner. Letztere werden in der heutigen UTF-8-Welt, in der derselbe Bytebereich eine andere Bedeutung hat, niemals verwendet.
Wenn Sie auch die 8-Bit-Codes abdecken müssen (und dann vermutlich mit bytes
Werten arbeiten), wird der reguläre Ausdruck zu einem Bytemuster wie dem folgenden:
ansi_escape_8bit = re.compile(br'''
(?: # either 7-bit C1, two bytes, ESC Fe (omitting CSI)
\x1B
[@-Z\\-_]
| # or a single 8-bit byte Fe (omitting CSI)
[\x80-\x9A\x9C-\x9F]
| # or CSI + control codes
(?: # 7-bit CSI, ESC [
\x1B\[
| # 8-bit CSI, 9B
\x9B
)
[0-?]* # Parameter bytes
[ -/]* # Intermediate bytes
[@-~] # Final byte
)
''', re.VERBOSE)
result = ansi_escape_8bit.sub(b'', somebytesvalue)
die bis zu verdichtet werden kann
ansi_escape_8bit = re.compile(
br'(?:\x1B[@-Z\\-_]|[\x80-\x9A\x9C-\x9F]|(?:\x1B\[|\x9B)[0-?]*[ -/]*[@-~])'
)
result = ansi_escape_8bit.sub(b'', somebytesvalue)
Weitere Informationen finden Sie unter:
Das von Ihnen angegebene Beispiel enthält 4 CSI-Codes (Control Sequence Introducer), die durch die \x1B[
oder ESC-[
Öffnungsbytes gekennzeichnet sind, und enthält jeweils einen SGR-Code (Select Graphic Rendition), da diese jeweils mit enden m
. Die Parameter (durch ;
Semikolons getrennt ) dazwischen teilen Ihrem Terminal mit, welche Grafikwiedergabeattribute verwendet werden sollen. Für jede \x1B[....m
Sequenz werden also drei Codes verwendet:
- 0 (oder
00
in diesem Beispiel): Zurücksetzen , alle Attribute deaktivieren
- 1 (oder
01
im Beispiel): fett
- 31: rot (Vordergrund)
ANSI bietet jedoch mehr als nur CSI-SGR-Codes. Mit CSI allein können Sie auch den Cursor steuern, Linien oder die gesamte Anzeige löschen oder scrollen (vorausgesetzt, das Terminal unterstützt dies natürlich). Über CSI hinaus gibt es Codes, mit denen Sie alternative Schriftarten ( SS2
und SS3
) auswählen , "private Nachrichten" senden (Passwörter denken), mit dem Terminal ( DCS
), dem Betriebssystem ( OSC
) oder der Anwendung selbst kommunizieren können ( APC
eine Möglichkeit für Anwendungen) Huckepack-benutzerdefinierte Steuercodes für den Kommunikationsstrom) und weitere Codes zum Definieren von Zeichenfolgen ( SOS
, Beginn der Zeichenfolge, Zeichenfolgenabschluss ST
) oder zum Zurücksetzen aller Elemente auf einen Basiszustand ( RIS
). Die obigen regulären Ausdrücke decken all dies ab.
Beachten Sie, dass der obige reguläre Ausdruck jedoch nur die ANSI C1-Codes entfernt und keine zusätzlichen Daten, die diese Codes möglicherweise markieren (z. B. die zwischen einem OSC-Öffner und dem abschließenden ST-Code gesendeten Zeichenfolgen). Das Entfernen dieser würde zusätzliche Arbeit außerhalb des Rahmens dieser Antwort erfordern.