首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同字符串分行的re.sub不同答案

相同字符串分行的re.sub不同答案
EN

Stack Overflow用户
提问于 2019-12-11 01:01:24
回答 2查看 37关注 0票数 0

我正在尝试使用not ...替换任何字符串,然后使用re.sub()poor替换为good

代码语言:javascript
复制
string1 ="""The lyrics are not that poor!  
The lyrics are poor! """

print(re.sub("(not).*(poor)" , 'good' , string1 ))

输出:

代码语言:javascript
复制
The lyrics are good!  
The lyrics are poor! 

相同的代码如果我在单行中使用字符串,它会给出不同的答案:

代码语言:javascript
复制
string1 ="""The lyrics are not that poor!  The lyrics are poor! """

print(re.sub("(not).*(poor)" , 'good' , string1 ))

输出:

代码语言:javascript
复制
The lyrics are good! 

输出应该是The lyrics are good! The lyrics are poor!。为什么它只返回The lyrics are good!

EN

回答 2

Stack Overflow用户

发布于 2019-12-11 01:05:34

在单行版本中,正则表达式将整个子字符串not that poor! The lyrics are poor转换为good

正则表达式是贪婪的,这意味着它们尽可能地匹配。正则表达式不会在出现第一个poor时停止--它会一直转到第二个出现的地方。

票数 1
EN

Stack Overflow用户

发布于 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,并且引擎再次尝试使用>继续。现在,>匹配成功。正则表达式中的最后一个令牌已匹配。引擎报告已成功匹配。那才像话。

完整的示例

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
> python test123.py
The lyrics are good!
The lyrics are poor!
The lyrics are good!  The lyrics are poor!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59272195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档