我使用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'}
结果。
如何在第一组中获得所有潜在的转义序列?
答案 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()