用于从文本中分离ANSI转义字符的正则表达式

时间:2017-01-17 23:05:13

标签: python regex

我使用colorama将ANSI代码添加到文本中,我需要从文本中分割ANSI颜色代码,以便可以以列格式打印文本。以下表达式将单个颜色代码与文本分开,但不是双重代码。

# adapted from https://stackoverflow.com/questions/2186919
split_ANSI_escape_sequences = re.compile(r"""
    (?P<col>
    \x1b     # literal ESC
    \[       # literal [
    [;\d]*   # zero or more digits or semicolons
    [A-Za-z] # a letter
    )*
    (?P<text>.*)
    """, re.VERBOSE).fullmatch

def split_ANSI(s):
    return split_ANSI_escape_sequences(s).groupdict()

结果如下:

>>> split_ANSI('\x1b[31m\x1b[1mtext')
{'col': '\x1b[1m', 'text': 'text'}

它正确分割,但丢失了格式信息。我期待

{'col': '\x1b[31m\x1b[1m', 'text': 'text'}

结果。

如何在第一组中获得所有潜在的转义序列?

1 个答案:

答案 0 :(得分:1)

我在Python RegEx multiple groups找到答案,提出了不同的问题。

每个匹配都会覆盖第一个命名组。这个版本有效:

split_ANSI_escape_sequences = re.compile(r"""
    (?P<col>(\x1b     # literal ESC
    \[       # literal [
    [;\d]*   # zero or more digits or semicolons
    [A-Za-z] # a letter
    )*)
    (?P<name>.*)
    """, re.VERBOSE).match

def split_ANSI(s):
    return split_ANSI_escape_sequences(s).groupdict()