匹配VT100转义序列的Python正则表达式

11 投票
3 回答
5846 浏览
提问于 2025-04-17 04:48

我正在写一个Python程序,用来记录终端的操作(类似于script这个程序),我想在把记录写入磁盘之前,先把VT100的转义序列过滤掉。我想用一个像这样的函数:

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

那么在escape_regex里面应该放什么呢?

3 个回答

1

我找到了一种方法,可以成功解析vt100颜色代码,并去掉那些不可打印的转义序列。这个代码片段在这里可以找到,当我使用telnetlib进行telnet会话时,它成功地帮我去掉了所有的代码:

    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
3

VT100代码已经根据相似的模式进行了分组(大部分是这样的),你可以在这里查看:

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

我觉得最简单的方法是使用一些工具,比如regexbuddy,来为每一组VT100代码定义一个正则表达式。

5

这个关于转义序列的组合表达式可以是一些比较通用的内容,像这样:

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

应该和 re.I 一起使用

这个表达式包含了:

  1. 两字节序列,也就是 \x1b 后面跟着一个字符,字符范围从 @_
  2. 一字节的CSI,也就是 \x9b,而不是 \x1b + "["

不过,这个表达式对那些定义键映射的序列或者包含在引号里的字符串是无效的。

撰写回答