加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:44:26 所属栏目:Python 来源:网络整理
导读:import restr='abc defg'm1 = re.match(".*(def)?",str)m2 = re.match(".*(def)",str)print (m1.group(1),m2.group(1)) 以上输出为: (None,‘def’) 到底是怎么回事?即使使用非贪心的重复操作符,可选的捕获组(def)?不匹配 解决方法 当正则表达式引擎尝试
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兼容”正则表达式的行为相匹配).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读