回复sub()是否替换为不使用捕获组的匹配文本?

2024-04-23 21:39:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚如何使python的re模块在彩色输出中表现得更像grep。你知道吗

这意味着我需要获取一个我无法控制的简单正则表达式,在一个字符串中找到它,然后只对匹配项上色。因为我无法控制regex,所以我不能依赖捕获组来解决问题。你知道吗

例如,如果我有:

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

我希望python将lolw替换为使用匹配项的字符串,而不使用regex中的捕获组。比如:

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

将产生:

"omg!lo!!lw!tfbbq"

最后,我只是尝试将s中与发送的regex匹配的部分着色;grep只使用简单的字符串输入,不使用捕获组。你知道吗

这在python中是可能的吗?你知道吗


Tags: 模块the字符串relostringgrepregex
2条回答

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

import re

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

!放在l前面

输出

omg!lo!lwtfbbq

表达式在regex101.com的右上角面板上解释,如果您希望探索/简化/修改它,在this link中,您可以查看它如何与一些示例输入匹配(如果您愿意)。你知道吗

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

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

请注意,match对象的.group方法返回整个匹配(无论是否存在捕获组)。如果有捕获组,则.groups返回那些捕获的组。你知道吗

为了回答你关于着色的问题,我建议你看一下colorama。你知道吗

相关问题 更多 >