re.sub() - 在不使用捕获组的情况下替换为匹配的文本?
re.sub() - Replace with text from match without using capture groups?
我正在想办法让 python 的 re
模块在彩色输出中表现得更像 grep
。
这意味着我需要采用我无法控制的任意正则表达式,在字符串中找到它,然后只为匹配项着色。因为我无法控制正则表达式,所以我的解决方案不能依赖捕获组。
例如,如果我有:
s="omglolwtfbbq"
regex=r"l[\w]"
我希望 python 将 lo
和 lw
替换为使用其中匹配项的字符串,在正则表达式中没有捕获组.所以像这样:
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 的右上面板进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。
我正在想办法让 python 的 re
模块在彩色输出中表现得更像 grep
。
这意味着我需要采用我无法控制的任意正则表达式,在字符串中找到它,然后只为匹配项着色。因为我无法控制正则表达式,所以我的解决方案不能依赖捕获组。
例如,如果我有:
s="omglolwtfbbq"
regex=r"l[\w]"
我希望 python 将 lo
和 lw
替换为使用其中匹配项的字符串,在正则表达式中没有捕获组.所以像这样:
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 的右上面板进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。