re.sub()-使用匹配项中的文本替换而不使用捕获组?

时间:2019-08-06 23:43:56

标签: python regex regex-group

我试图弄清楚如何使python的re模块在​​彩色输出中的行为更像grep

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

例如,如果我有:

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

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

re.sub(regex, "!%s!", s)
re.sub(regex, "!\0!", s)
re.sub(regex, "!<THE MATCHING STRING>!", s)

会产生:

"omg!lo!!lw!tfbbq"

最终,我只是想为s匹配发送的正则表达式的部分着色; grep使用简单的字符串输入且没有捕获组来完成此操作。

这在python中可能吗?

2 个答案:

答案 0 :(得分:1)

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

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

请注意,匹配对象的.group方法将返回整个匹配项(无论是否存在捕获组)。如果您有捕获组,则.groups返回这些捕获组。

要专门回答有关着色的问题,建议您看看colorama

答案 1 :(得分:0)

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

import re

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

用于在!之前放置l

输出

omg!lo!lwtfbbq

该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果愿意的话。