找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2270|回复: 7

[求助] 备选正则匹配问题

26

主题

84

帖子

84

积分

新手

积分
84
银发的index 发表于 2019-7-15 20:36:43 | 显示全部楼层 |阅读模式
python提到的(?(id/name)yes|no)是匹配yes部分如果符合前面组ID或组name的部分,如果不符合前面组id或组name就匹配no

然后看下面的匹配

import re
re.search(r'(?P<world>a)(?(world)b|c)','aab')
结果
<re.Match object; span=(1, 3), match='ab'>正选部分是正常匹配了的
再看备选部分
re.search(r'(?P<world>a)(?(world)b|c)','aac')
结果返回None
这里不应该是匹配到'ac'吗



回复

使用道具 举报

0

主题

30

帖子

30

积分

贫民

积分
30
胡扶林 发表于 2019-7-16 15:06:49 | 显示全部楼层
re.search(r'(?P<world>a)(?(world)b|c)','aac') 这句话的意思是前面的分组world匹配上就用yes-pattern,匹配上采用no-pattern。你现在能匹配上前面的a,但是后面的yes-pattern匹配不上b,自然返回None
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2019-7-16 15:29:16 | 显示全部楼层
re.search(r'(?P<world>a)?(?(world)b|c)','aac')
结果:<re.Match object; span=(2, 3), match='c'>
这样对比一下,你或许就明白了, 其实如果前面的world分组如果不允许为空的话, 没有匹配到的时候, 就整体匹配失败, 返回None; 如果前面分组world允许为空,如上代码,那么它就会执行后面的yes-pattern|no-pattern匹配。
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2019-7-16 17:53:27 | 显示全部楼层
blueelwang 发表于 2019-7-16 15:29
re.search(r'(?Pa)?(?(world)b|c)','aac')
结果:
这样对比一下,你或许就明白了, 其实如果前面的world分 ...

哦,也就是先匹配a如果匹配上a了就继续匹配yes部分,如果匹配上yes部分就正常匹配,匹配不上yes就返回None,另一个是先匹配a,如果匹配不上a就返回no的部分?但是因为第一个表达式首先要匹配a所以一定返回yes-pattern或none?如果要匹配no-pattern部分必须要匹配(?P<name>a)部分的a同时后面(?(name))还不能出现匹配上a的部分?可是匹配不应该是顺序匹配吗?(?P<name>a)匹配结束了第二个子式也就是(?(name))部分不应该从匹配完(?P<name>a)结束的部分继续匹配吗?
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2019-7-16 19:10:15 | 显示全部楼层
银发的index 发表于 2019-7-16 17:53
哦,也就是先匹配a如果匹配上a了就继续匹配yes部分,如果匹配上yes部分就正常匹配,匹配不上yes就返回Non ...

你再仔细对比一下我写的和你写的哪里有区别。
其实就多了一个问号
然后结合我上面的解释思考一下
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2019-7-16 20:21:03 | 显示全部楼层
blueelwang 发表于 2019-7-16 19:10
你再仔细对比一下我写的和你写的哪里有区别。
其实就多了一个问号
然后结合我上面的解释思考一下 ...

对啊我看了就差一个问号,问号不是代表0和1嘛,我试了0也行,如果要用match即从头匹配就必须只能是no-pattern部分开头即c在0号位,也就是(?(name)yes|no)的匹配是看yes|no匹配前整个字符串是否有name组内成员?如果有组内成员匹配yes部分,没有组内成员匹配no,即对形如‘adddc’这种字符串都会检索name组内成员是否存在,所以除了把name组设空就必然会匹配到满足name组的部分然后选择yes匹配?
还有另一个问题如果写成这样的形式(?P<name>a{0})不是把name组设空吗?为什么这样的形式不能匹配no部分呢?
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2019-7-19 10:12:44 | 显示全部楼层
银发的index 发表于 2019-7-16 20:21
对啊我看了就差一个问号,问号不是代表0和1嘛,我试了0也行,如果要用match即从头匹配就必须只能是no-pat ...

看下这篇文章: https://www.pythontab.com/html/2 ... heng_0719/1463.html
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2019-7-20 21:22:46 | 显示全部楼层
blueelwang 发表于 2019-7-19 10:12
看下这篇文章: https://www.pythontab.com/html/2019/pythonhexinbiancheng_0719/1463.html

谢谢,虽然感觉还是不太理解整体匹配
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表