【问题标题】:How can I substitute a regex only once in Python?如何在 Python 中只替换一次正则表达式?
【发布时间】:2012-10-04 17:09:21
【问题描述】:

所以现在,re.sub 这样做:

>>> re.sub("DELETE THIS", "", "I want to DELETE THIS472 go to DON'T DELETE THIS847 the supermarket")
"I want to  go to DON'T  the supermarket"

我希望它只删除“DELETE THISXXX”的第一个实例,其中 XXX 是一个数字,因此结果是

"I want to  go to DON'T DELETE THIS847 the supermarket"

XXX 是一个变化的数字,所以我确实需要一个正则表达式。我怎样才能做到这一点?

【问题讨论】:

  • 为什么需要正则表达式? ..如果它是一系列像这样的简单模式,我认为你不需要正则表达式......事实上,这听起来像是“我遇到问题并且我认为“我知道我会使用正则表达式”的经典案例......现在你有两个问题”

标签: python regex


【解决方案1】:

正如documentation 中为re.sub(pattern, repl, string, count=0, flags=0) 所写,您可以在以下位置指定count 参数:

    re.sub(pattern, repl, string[, count, flags])

如果你只给出一个计数,它只会替换第一个

【讨论】:

    【解决方案2】:

    来自http://docs.python.org/library/re#re.sub

    可选参数count是要替换的模式出现的最大数量; count 必须是非负整数。如果省略或为零,则将替换所有匹配项。该模式的空匹配仅在与前一个匹配不相邻时被替换,因此sub('x*', '-', 'abc') 返回'-a-b-c-'

    【讨论】:

      【解决方案3】:

      可选参数计数是要替换的模式出现的最大数量; count 必须是非负整数。

      re.sub(pattern, repl, string, count=0, flags=0)
      

      设置 count = 1 只替换第一个实例。

      【讨论】:

        【解决方案4】:

        我认为您的措辞“第一个实例”导致其他所有人都按照 count 的方向回答,但如果您的意思是仅当一个词组与您搜索的词组完全匹配时才删除它,那么首先您必须用“短语”来定义你的意思,例如非小写字符:

        DON'T DELETE THIS
        

        在这种情况下,你可以这样做:

        (?<![^a-z]+)\s+DELETE THIS\s+(?![^a-z]+)
        

        我不确定 Python 是否允许任意长度的否定后向断言。如果不是,请删除第一个+

        【讨论】:

        • 感谢您的回答,并为我尴尬的措辞感到抱歉。实际上我的意思是只删除第一次出现的“DELETE THIS”,但感谢您的贡献:)
        【解决方案5】:

        您可以为此使用str.replace()

        In [9]: strs="I want to DELETE THIS go to DON'T DELETE THIS the supermarket"
        
        In [10]: strs.replace("DELETE THIS","",1) # here 1 is the count
        Out[10]: "I want to  go to DON'T DELETE THIS the supermarket"
        

        【讨论】:

        • 您不能使用替换来匹配正则表达式。
        • 我不认为 OP 实际上需要正则表达式...直到我看到一个需要它的搜索模式,我要使用正则表达式是矫枉过正
        • @sudo_o 实际上 OP 在这里尝试做的事情可以用 replace() 来完成,regex 对于复杂的模式很有用。
        • @JoranBeasley 抱歉,这个例子不清楚,我确实需要一个正则表达式,正如我在上一句中所说的那样。 IE。我想删除字符串“DELETE THIS123”和“DELETE THIS736”,但不知道数字是多少。
        • 啊,你去吧......这就是你应该从一开始就发布的内容:)
        猜你喜欢
        • 2011-04-26
        • 2011-03-19
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        相关资源
        最近更新 更多