re.sub() - 在不使用捕获组的情况下替换为匹配的文本?

re.sub() - Replace with text from match without using capture groups?

我正在想办法让 python 的 re 模块在彩色输出中表现得更像 grep

这意味着我需要采用我无法控制的任意正则表达式,在字符串中找到它,然后只为匹配项着色。因为我无法控制正则表达式,所以我的解决方案不能依赖捕获组。

例如,如果我有:

s="omglolwtfbbq"
regex=r"l[\w]"

我希望 python 将 lolw 替换为使用其中匹配项的字符串,在正则表达式中没有捕获组.所以像这样:

re.sub(regex, "!%s!", s)
re.sub(regex, "![=12=]!", s)
re.sub(regex, "!<THE MATCHING STRING>!", s)

会产生:

"omg!lo!!lw!tfbbq"

最终,我只是想为 s 中与发送的正则表达式匹配的部分着色; grep 使用简单的字符串输入而不使用捕获组来执行此操作。

这在 python 中可行吗?

为了回答您的第一个问题,re.sub 允许您使用函数而不是固定的替换字符串。例如

>>> s = "omglolwtfbbq"
>>> regex = r"l[\w]"
>>> re.sub(regex, lambda x: "!%s!" % x.group(), s)
'omg!lo!!lw!tfbbq'

请注意,匹配对象的 .group 方法 returns 整个匹配(无论是否存在捕获组)。如果您有捕获组,那么 .groups returns 那些捕获的组。

要具体回答您关于着色的问题,我建议您看一下 colorama

我认为 Python re 模块不会那样做,相反,您可以设计积极的环顾四周来做到这一点 re.sub,例如:

import re

print(re.sub(r'(?=l)', '!', "omglolwtfbbq"))

用于在 l

之前放置一个 !

输出

omg!lo!lwtfbbq

表达式在 regex101.com, if you wish to explore/simplify/modify it, and in this link 的右上面板进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。