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

标签 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中可能吗?

最佳答案

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

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

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

要具体回答您有关着色的问题,我建议您查看 colorama .

关于python - re.sub() - 在不使用捕获组的情况下替换为匹配中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385277/

相关文章:

python - Alembic 不处理 column_types.PasswordType : Flask+SQLAlchemy+Alembic

java - 替换单词中的重复字母,但有异常(exception)

Java 正则表达式 Matcher.end() 未返回所需的索引

javascript - 用于验证整数或带两位小数的 float 的正则表达式

python - 使用正则表达式替换命令在文件名字符串中小于 10 的数字前面插入前导零

python - 将日期时间转换为自 UTC 午夜以来的毫秒数或使用 Pandas 本地化为 CSV 文件

Python:检查对象是否不是 "array-type"

python - 将numpy数组转换为2d数组

c# - 拆分具有键值对的文本行,其中值可以为空

java - 查找恰好(或至少)有一个换行符的 n 个字符