【发布时间】:2020-04-15 08:03:45
【问题描述】:
我正在尝试为 Python 日志格式化程序实现某种类似于降价的行为。
我们以这个字符串为例:
**This is a warning**: Virus manager __failed__
经过一些正则表达式后,字符串失去了类似 markdown 的语法,并被转换为 bash 代码:
\033[33m\033[1mThis is a warning\033[0m: Virus manager \033[4mfailed\033[0m\033[0m
但是应该压缩成
\033[33;1mThis is a warning\033[0m: Virus manager \033[4mfailed\033[0m
除了许多其他不起作用的解决方案之外,我尝试了这些:
(\\033\[([\d]+)m){2,} => 捕获:\033[33m\033[1m with g1 '\033[1m' and g2 '1' and \033[0m\033[0mwith g1 '\033[0m' and g2 '0'
(\\033\[([\d]+)m)+很多结果,不行
(?:(\\033\[([\d]+)m)+)很多结果,虽然如果我理解正确的话,这是重复模式的推荐方式,不行
还有其他……
我的目标是得到结果:
输入
\033[33m\033[1mThis is a warning\033[0m: Virus manager \033[4mfailed\033[0m\033[0m
输出
匹配 1
033[33m\033[1m
组 1:33
组 2:1
第 2 场比赛
033[0m\033[0m
组 1:0
组 2:0
换句话说,捕获那些“重复”的而不是单独的,这样我就可以将它们与正则表达式子融合。
【问题讨论】:
-
有很多不必要的信息,你能发布一个示例输入和预期的输出吗?
-
在最后... 输入:\033[33;1m这是一个警告\033[0m: 病毒管理器\033[4mfailed\033[0m 输出阅读消息的结尾跨度>
-
由表达式创建的匹配组的数量将始终是一个设定值。例如
(...)+将只生成一个匹配组。 -
这不是 100% 清楚:规则是什么?可以
\033[33m\033[1m\033[22m吗?如果是,预期的输出是什么? -
试试
re.sub(r'(?:\\033\[\d+m){2,}', lambda m: r'\033['+";".join(set(re.findall(r"\[(\d+)", m.group())))+'m', text)