Регулярное выражение Python для соответствия escape-последовательностям VT100

Я пишу программу на Python, которая регистрирует взаимодействие с терминалом (аналогично программе script), и я хочу отфильтровать escape-последовательности VT100 перед записью на диск. Я хотел бы использовать такую ​​функцию:

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

Что должно быть в escape_regex?


person Lorin Hochstein    schedule 22.10.2011    source источник
comment
Это немного сложно: en.wikipedia.org/wiki/ANSI_escape_sequences   -  person sarnold    schedule 22.10.2011
comment
Проверьте webdeveloper.com/forum/showthread.php?t=186004. для версии PHP. Должно быть просто преобразовать его в python.   -  person Mansour    schedule 22.10.2011
comment
В духе этих других комментариев, вот также процесс TCL, который делает то же самое... wiki.tcl .tk/9673   -  person Niall Byrne    schedule 27.10.2011
comment
Вот один, который сработал для меня: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" (источник)   -  person Adam Monsen    schedule 21.03.2013


Ответы (3)


Комбинированное выражение для escape-последовательностей может быть примерно таким:

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

Следует использовать с re.I

Это включает в себя:

  1. Двухбайтовые последовательности, т. е. \x1b, за которыми следует символ в диапазоне от @ до _.
  2. Однобайтовый CSI, то есть \x9b вместо \x1b + "[".

Однако это не будет работать для последовательностей, определяющих сопоставление клавиш или иным образом включенных строк, заключенных в кавычки.

person Ja͢ck    schedule 26.02.2013

Коды VT100 уже сгруппированы (в основном) по схожим шаблонам здесь:

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

Я думаю, что самым простым подходом было бы использование какого-либо инструмента, такого как regexbuddy, для определения регулярного выражения для каждой группы кодов VT100.

person Alex Brooks    schedule 20.11.2011

Я нашел следующее решение для успешного анализа цветовых кодов vt100 и удаления непечатаемых escape-последовательностей. Фрагмент кода найден здесь успешно удалил все коды для меня при запуске сеанса telnet с использованием 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
person Steph    schedule 09.03.2015
comment
Это не будет работать для некоторых распространенных последовательностей инициализации, таких как escape = escape › escape 7 escape 8, а также любой элемент управления reset mode (заканчивается на l). Они перечислены в документации xterm: invisible-island.net/xterm/ctlseqs/ctlseqs.html. - person Thomas Dickey; 11.03.2015