【问题标题】:re.sub() - Replace with text from match without using capture groups?re.sub() - 用匹配文本替换而不使用捕获组?
【发布时间】:2019-12-14 13:15:21
【问题描述】:

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

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

例如,如果我有:

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 中可行吗?

【问题讨论】:

    标签: python regex regex-group


    【解决方案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

    【讨论】:

    • 这是我一直在寻找的解决方案 - 太棒了!
    【解决方案2】:

    我不认为 Python re 模块可以做到这一点,取而代之的是,您可以设计积极的环顾四周来做到这一点 re.sub,例如:

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

    用于在l 之前放置!

    输出

    omg!lo!lwtfbbq
    

    表达式在regex101.com 的右上方面板中进行了解释,如果您想探索/简化/修改它,在this link 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。

    【讨论】:

    • 谢谢 Emma - 我更新了问题以更清楚地说明我在问什么;我实际上对发送的正则表达式没有任何控制权;这完全是任意的。
    猜你喜欢
    • 2013-02-03
    • 2015-02-22
    • 1970-01-01
    • 2019-06-08
    • 2023-03-07
    • 2018-04-27
    • 2016-11-16
    • 2019-05-16
    • 2016-05-23
    相关资源
    最近更新 更多