我正在尝试使用not ...替换任何字符串,然后使用re.sub()将poor替换为good。
string1 ="""The lyrics are not that poor!
The lyrics are poor! """
print(re.sub("(not).*(poor)" , 'good' , string1 ))输出:
The lyrics are good!
The lyrics are poor! 相同的代码如果我在单行中使用字符串,它会给出不同的答案:
string1 ="""The lyrics are not that poor! The lyrics are poor! """
print(re.sub("(not).*(poor)" , 'good' , string1 ))输出:
The lyrics are good! 输出应该是The lyrics are good! The lyrics are poor!。为什么它只返回The lyrics are good!
发布于 2019-12-11 01:05:34
在单行版本中,正则表达式将整个子字符串not that poor! The lyrics are poor转换为good。
正则表达式是贪婪的,这意味着它们尽可能地匹配。正则表达式不会在出现第一个poor时停止--它会一直转到第二个出现的地方。
发布于 2019-12-11 01:06:22
您必须执行print(re.sub("(not).*?(poor)", 'good', string1))
有关更多细节,请访问https://www.regular-expressions.info/repeat.html#lazy
懒惰而不是贪婪这个问题的快速解决方案是使plus懒惰而不是贪婪。惰性量词有时也被称为“不贪婪”或“不情愿”。您可以通过在正则表达式中的加号后面放置一个问号来完成此操作。您可以对星号、花括号和问号本身执行相同的操作。所以我们的例子变成了<.+?>。让我们再来看看正则表达式引擎的内部。
同样,<匹配字符串中的第一个<。下一个标记是点,这一次由一个惰性加号重复。这告诉正则表达式引擎尽可能少地重复点。最小值为1。因此,引擎将点与E匹配。要求已满足,并且引擎继续使用>和M。这将失败。再一次,引擎将回溯。但这一次,回溯将迫使lazy plus扩大而不是缩小其覆盖范围。因此,.+的匹配项被扩展到EM,并且引擎再次尝试使用>继续。现在,>匹配成功。正则表达式中的最后一个令牌已匹配。引擎报告已成功匹配。那才像话。
完整的示例
import re
string1 = """The lyrics are not that poor!
The lyrics are poor! """
print(re.sub("(not).*?(poor)", 'good', string1))
string1 = """The lyrics are not that poor! The lyrics are poor! """
print(re.sub("(not).*?(poor)", 'good', string1))输出
> python test123.py
The lyrics are good!
The lyrics are poor!
The lyrics are good! The lyrics are poor!https://stackoverflow.com/questions/59272195
复制相似问题