提取 ANSI 彩色文本中包含的所有大写单词

Extract all caps word contained in ANSI colored text

如何在终端中使用 ANSI 代码提取包含在正则表达式中的全大写单词?

示例:

s1 = '      Elapsed: 0:00:59.694 - Elapsed/GB: 0:00:00.125 - Result: \x1b[92mPASS\x1b[0m\r\n'

我的失败:

re.findall(r'- Result: [^\x1b[92m\x1b[0m\r\n]', s1)
re.findall(r'- Result: ([A-Z]+)', s1)

预计:

PASS

如果你事先知道要避免的字符是什么,你可以使用以下方法:

import re

s1 = '      Elapsed: 0:00:59.694 - Elapsed/GB: 0:00:00.125 - Result: \x1b[92mPASS\x1b[0m\r\n'
result = re.findall('- Result: \x1b\[92m(.+)\x1b\[0m', s1)
print(result)

这会打印:

['PASS']

试试这个:

re.findall("\x1b\[.*?m([A-Z0-9]+?)\x1b\[", a)

所以,首先,如果它是该行中唯一的颜色,那么,从 ANSI 代码本身开始。 意识到我没有在模式前加上 r 前缀,让 Python pre-treat 字符串 - 在 之前应用 \将字符串传递给正则表达式引擎:这确保 \x1b 作为 <ESC> 字符的 unicode 代码点传递。此外,“[”之前的双斜杠表示它是文字。

第二件事是修复正则表达式中的“m”,因为它是实际更改颜色属性的命令,不需要设置任何特定颜色。

最后但并非最不重要的一点是,使用带 [ ] 的正则表达式字符范围表示 我想要一个只有大写字母(和数字)的单词,在另一个 ANSI 属性命令之前。

In [265]: a = s1 = '      Elapsed: 0:00:59.694 - Elapsed/GB: 

In [266]: re.findall("\x1b\[.*?m([A-Z0-9]+?)\x1b\[", a)
Out[266]: ['PASS']