【问题标题】:Replace all occurrences that match regular expression替换所有匹配正则表达式的匹配项
【发布时间】:2016-11-04 13:08:03
【问题描述】:

我有一个正则表达式来搜索包含'.00.''.11.' 的字符串,如下所示:

.*\.(00|11)\..*

我想做的是用'X00X''X11X' 替换所有匹配模式的匹配项。例如,字符串'.00..0..11.' 将导致'X00X.0.X11X'

我正在研究 Python re.sub 方法,但不确定如何有效地做到这一点。返回的匹配对象仅在第一次出现时匹配,因此效果不佳。有什么建议吗?我应该为此任务使用字符串替换吗?谢谢。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    re.sub()Python 2Python 3 的文档)确实替换了它找到的所有匹配项,但是您对 .* 的使用可能导致正则表达式匹配太多(甚至其他出现的 .00. 等。 )。只需这样做:

    In [2]: re.sub(r"\.(00|11)\.", r"X\1X", ".00..0..11.")
    Out[2]: 'X00X.0.X11X'
    

    注意图案不能重叠:

    In [3]: re.sub(r"\.(00|11)\.", r"X\1X", ".00.11.")
    Out[3]: 'X00X11.'
    

    【讨论】:

    • re.sub 是否使用搜索而不匹配?我使用 .* 因为我认为它使用了 match。
    • 在 Python 中,match 在字符串的开头搜索匹配,它不需要完整的字符串匹配。 re.sub 查找与模式匹配的所有非重叠序列并替换它们。
    • 对不起,我不明白:来自文档“返回通过替换repl替换字符串中最左边的不重叠出现的模式获得的字符串”:这是如何“替换它找到的所有匹配项”?
    • @gented:正则表达式引擎从左到右遍历字符串。一旦找到匹配项,它就会替换它并继续前进。因此,
    • 如果你的字符串是“aaaa”并且你用“bb”替换了“aa”,你会得到“bbbb”而不是“bbbbbb”,即使有三个(重叠的)“aa”实例字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2012-05-16
    • 2021-10-12
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多