Python正则表达式问号运算符不工作?

前端之家收集整理的这篇文章主要介绍了Python正则表达式问号运算符不工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))

以上输出为:

(None,‘def’)

到底是怎么回事?即使使用非贪心的重复操作符,可选的捕获组(def)?不匹配

解决方法

当正则表达式引擎尝试匹配时,会发生什么.*(def)对abc defg:

>首先,引擎开始尝试匹配字符串开头的正则表达式.
>贪心的子模式*最初尝试匹配多次,匹配整个字符串.
>因为这导致其余的匹配失败,所以正则表达式引擎回溯直到找到一种方法来匹配(def),当.*只匹配abc时发生.

但是,如果我们将正则表达式更改为.*(def)?,则会发生以下情况:

>首先,正则表达式引擎再次从字符串的开头开始.
>接下来,它再次尝试匹配.*尽可能多的次数,匹配整个字符串.
>但是在这一点上,由于正则表达式的其余部分都是可选的,所以找到了整个正则表达式的匹配!自(def)?是贪婪的,引擎会喜欢匹配它,如果它可以,但它不会回溯早期的子模式,只是为了看看是否可以.相反,它只是让.*摆脱整个字符串,没有什么(def)?

类似的事情发生在.*?(def)和.*?(def)?:

>再次,引擎从字符串的开头开始.
>不客气的子模式*尝试尽可能少地匹配,即不完全匹配.
>那时,(def)不能匹配,但是(def)?能够.因此,对于(def),正则表达式引擎必须返回并考虑更长的匹配.*?直到找到一个允许完整模式匹配的,而对于(def)?它不必这样做,所以没有.

有关更多信息,请参阅“Combining RE Pieces” section of the Perl regular expressions manual(与Python的“Perl兼容”正则表达式的行为相匹配).

猜你在找的Python相关文章