【问题标题】:Replacing all overlapping patterns in a string替换字符串中的所有重叠模式
【发布时间】:2017-05-16 18:30:10
【问题描述】:

给定字符串:s = "101010101",我想用0X0 模式替换每次出现的模式010,这样结果应该是s = "10X0X0X01"

另一个类似的问题是将相同的模式010替换为00,这样得到的字符串应该是s = 100001

到目前为止,我尝试过:

import re
s = "101010101"
s = re.sub("010", "0X0", s)

但结果字符串是10X010X01,缺少替换中间的1

有什么帮助吗?

【问题讨论】:

    标签: string python-2.7 replace substitution


    【解决方案1】:

    您可以使用lookarounds 来查找值而不将它们包含在匹配中:

    s = re.sub(r"(?<=0)1(?=0)", "X", s)
    

    (?&lt;=0)1(?=0) 匹配前面的单个 1 字符 – (?&lt;=…) – 然后是 - (?=…) - 一个零。

    【讨论】:

    • 太棒了!把010换成00会出现什么问题?
    • @Ale: "X"""
    • 是的,我刚刚意识到了。
    【解决方案2】:

    几乎所有的字符串操作问题都可以用正则表达式解决。这并不意味着您应该使用它们。这似乎是使用正则表达式的一个自然问题,但您并不真的需要它。您可以只去除前导/尾随 1,然后替换中间的 1,然后将前导/尾随 1 放回:

    s = "101010101"
    s = "1" + s[1:-1].replace("1", "X") + "1"
    
    print s
    

    输出:10X0X0X01

    s = "101010101"
    s = "1" + s[1:-1].replace("1", "") + "1"
    
    print s
    

    输出:100001

    我认为您会发现正则表达式非常强大,但几乎不可读且难以推理。以你的问题为例。您所做的看起来对没有使用正则表达式的人有用,但事实并非如此。

    这是一个权衡,但在我的书中,简单总是胜出。

    【讨论】:

    • 我很欣赏你的建议,但它似乎太具体了。事实上,问题是关于替换重叠模式。无论如何,谢谢。
    • 很公平。不过,我不确定它是否值得被否决。它确实回答了这个(特定的)问题。
    • 不是故意让它听起来像你做的!我希望投反对票的人能解释他们不喜欢什么……
    猜你喜欢
    • 2012-05-20
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多