Hallo Leute,
kennt einer von euch einen regulären Ausdrück für alle VT100 Kontrollzeichen?
Ich brauche den um die Kontrollzeichen aus einer Consolenasugabe zu eleminieren.
Mfg Mathias
Regulären Ausdruck für VT100
hallo!
weder kenn' ich einen fertigen Ausdruck, noch könnte ich einen schreiben,
aber die Regeln sind relativ einfach. Man kann die 256 möglichen Zeichen
in 16 Spalten zu je 16 Zeichen darstellen. Dann sind die Spalten 0, 1, 8 und 9
Steuerzeichen (z.B. CR), die Spalten 2 und 3 sind Ziffern und Satzzeichen usw.
"man ascii" hat ganz unten eine Tabelle für die Spalten 0...7.
Zur Dekodierung der magischen Zeichenfolgen muss man nur diese Spalten
unterscheiden, die Bedeutung der Zeichen innerhalb einer Spalte ist jeweils gleich.
Dann gibt es 5 Arten von Codes:
- a) echte, einzelne Steuerzeichen aus Spalte 0 und 1
- b) echte, einzelne Steuerzeichen aus Spalte 8 und 9
- c) die eigentlichen "Control Sequences"
- d) "Control Functions" aus einem 'ESC' und einem Zeichen aus Spalte 6 oder 7
- e) beliebig lange "Control Strings"
Die Arten a, b und besonders e kann man in der Praxis für diese Anwendung
vergessen. Abteilung d ist trivial: 'ESC' und genau 1 Zeichen aus '`'...'~'.
Die Art d besteht aus 4 Gruppen in fester Reihenfolge:
- 1) entweder 2 Zeichen 'ESC[' oder ein Zeichen 'CSI' (dezimal 155)
- 2) beliebig viele (auch 0) Zeichen aus der Spalte 3 ('0' ... '?')
- 3) beliebig viele (auch 0) Zeichen aus der Spalte 2 (' ' ... '/')
- 4) genau 1 Zeichen aus den Spalten 4 bis 7 ('@' ... '~')
wobei 'CSI' wahrscheinlich nicht benutzt wird.
Das war's schon, für RegExExperten kein Thema, oder
Das ganze nochmal als Amts-English.pdf gibt's hier: ECMA-048 (nur Kapitel 5)
Oder Ein VT100-Parser in C
weder kenn' ich einen fertigen Ausdruck, noch könnte ich einen schreiben,
aber die Regeln sind relativ einfach. Man kann die 256 möglichen Zeichen
in 16 Spalten zu je 16 Zeichen darstellen. Dann sind die Spalten 0, 1, 8 und 9
Steuerzeichen (z.B. CR), die Spalten 2 und 3 sind Ziffern und Satzzeichen usw.
"man ascii" hat ganz unten eine Tabelle für die Spalten 0...7.
Zur Dekodierung der magischen Zeichenfolgen muss man nur diese Spalten
unterscheiden, die Bedeutung der Zeichen innerhalb einer Spalte ist jeweils gleich.
Dann gibt es 5 Arten von Codes:
- a) echte, einzelne Steuerzeichen aus Spalte 0 und 1
- b) echte, einzelne Steuerzeichen aus Spalte 8 und 9
- c) die eigentlichen "Control Sequences"
- d) "Control Functions" aus einem 'ESC' und einem Zeichen aus Spalte 6 oder 7
- e) beliebig lange "Control Strings"
Die Arten a, b und besonders e kann man in der Praxis für diese Anwendung
vergessen. Abteilung d ist trivial: 'ESC' und genau 1 Zeichen aus '`'...'~'.
Die Art d besteht aus 4 Gruppen in fester Reihenfolge:
- 1) entweder 2 Zeichen 'ESC[' oder ein Zeichen 'CSI' (dezimal 155)
- 2) beliebig viele (auch 0) Zeichen aus der Spalte 3 ('0' ... '?')
- 3) beliebig viele (auch 0) Zeichen aus der Spalte 2 (' ' ... '/')
- 4) genau 1 Zeichen aus den Spalten 4 bis 7 ('@' ... '~')
wobei 'CSI' wahrscheinlich nicht benutzt wird.
Das war's schon, für RegExExperten kein Thema, oder
Das ganze nochmal als Amts-English.pdf gibt's hier: ECMA-048 (nur Kapitel 5)
Oder Ein VT100-Parser in C
Beware of programmers who carry screwdrivers.
- movies1978
- Beiträge: 44
- Registriert: 08.08.2002 13:39:41
Danke für die ausführliche Antwort!
Ich habe mittlere weile eine regulären Ausdruck geschrieben, der alles relativ ausfiltered. Sicher bin ich dabei nicht, da ich den durch probieren und ungefähres Schema gemacht habe, aber wen es interessiert. Außerdem habe ich mich noch von einer anderen Forums antwort inspirieren lassen (keine fremden Federn für mich)
Mfg
Mathias
EDIT :
noch besser (deckt noch mehr Fälle ab)
Ich habe mittlere weile eine regulären Ausdruck geschrieben, der alles relativ ausfiltered. Sicher bin ich dabei nicht, da ich den durch probieren und ungefähres Schema gemacht habe, aber wen es interessiert. Außerdem habe ich mich noch von einer anderen Forums antwort inspirieren lassen (keine fremden Federn für mich)
Code: Alles auswählen
VT100_RE = re.compile('\x1b(\\[[0-9;]*[a-zA-Z]|[a-zA-Z0-9\\(\\)])|\x1b\[\?25h')
Mathias
EDIT :
noch besser (deckt noch mehr Fälle ab)
VT100_RE = re.compile('\x1b(\\[[0-9;]*[a-zA-Z]|[a-zA-Z0-9\\(\\)])|\x1b\[\?\d+[lh]')