2011-10-22 8 views
9

Estoy escribiendo un programa Python que registra la interacción del terminal (similar al programa de script ), y me gustaría filtrar las secuencias de escape del VT100 antes de escribir en el disco. Me gustaría utilizar una función como esta:Python regex para que coincida con las secuencias de escape VT100

def strip_escapes(buf): 
    escape_regex = re.compile(???) # <--- this is what I'm looking for 
    return escape_regex.sub('', buf) 

lo que debe ir en escape_regex?

+0

Es un poco complicado: http://en.wikipedia.org/wiki/ANSI_escape_sequences – sarnold

+2

Comprobar http: // www .webdeveloper.com/forum/showthread.php? t = 186004 para una versión de PHP. Debería ser simple convertirlo a python. – Mansour

+1

En el espíritu de estos otros comentarios, aquí también hay un proceso de TCL que hace exactamente lo mismo ... http://wiki.tcl.tk/9673 –

Respuesta

2

códigos VT100 ya se agrupan (en su mayoría) de acuerdo con patrones similares aquí:

http://ascii-table.com/ansi-escape-sequences-vt-100.php

creo que el enfoque más simple sería utilizar alguna herramienta como RegexBuddy para definir una expresión regular para cada grupo de códigos VT100.

4

La expresión combinada para secuencias de escape puede ser algo genérico como esto:

(\x1b\[|\x9b)[^@-_]*[@-_]|\x1b[@-_] 

debe utilizarse con re.I

Esto incorpora:

  1. secuencias de dos bytes, es decir, \x1b seguido de un personaje en el rango de @ hasta _ .
  2. CSI de un byte, es decir \x9b en comparación con \x1b + "[".

Sin embargo, esto no funcionará para las secuencias que definen las asignaciones de teclas o cadenas incluidas entre comillas.

1

Encontré la siguiente solución para analizar correctamente los códigos de color vt100 y eliminar las secuencias de escape no imprimibles. El fragmento de código encontró here eliminado correctamente todos los códigos para mí cuando se ejecuta una sesión de telnet usando telnetlib:

def __processReadLine(self, line_p): 
    ''' 
    remove non-printable characters from line <line_p> 
    return a printable string. 
    ''' 

    line, i, imax = '', 0, len(line_p) 
    while i < imax: 
     ac = ord(line_p[i]) 
     if (32<=ac<127) or ac in (9,10): # printable, \t, \n 
      line += line_p[i] 
     elif ac == 27:     # remove coded sequences 
      i += 1 
      while i<imax and line_p[i].lower() not in 'abcdhsujkm': 
       i += 1 
     elif ac == 8 or (ac==13 and line and line[-1] == ' '): # backspace or EOL spacing 
      if line: 
       line = line[:-1] 
     i += 1 

    return line 
+0

Eso no funcionará para algunas secuencias de inicialización comunes, como escape = escape> escape 7 escape 8 , así como cualquier control de * modo de reinicio * (finaliza con "l"). Los que se enumeran en la documentación de xterm: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html –

Cuestiones relacionadas