python3正则模块中的(?(id)yes|no)构造

来源:互联网 发布:php list注意 编辑:程序博客网 时间:2024/05/16 14:19

1.问题

最近需要用python处理一些文档,其中用到正则表达式,发现一段时间不看已经忘得的差不多了,便又从网上翻看一些教程。在此推荐Python正则表达式指南,写的非常全面,很适合新手入门。在使用过程中,对于特殊构造的规则(?(id/name)yes-pattern|no-pattern),笔者遇到了一点问题。对于该规则,指南介绍为:“如果编号id或别名为name的组匹配到字符,需要匹配yes-pattern,否则需要匹配no-pattern。|no-pattern可以省略。”并且给出了示例,规则为'(\d)abc((1)\d|abc)',匹配成功字符串为'1abc2'或者'abcabc',但是在实际操作中,字符串'abcabc'却会报错:'NoneType' object has no attribute 'group',该规则并未匹配到'abcabc'。

2.分析与实验

通过实验发现,在id为1的组后加上+可以成功匹配:

>>>print(re.search(r'(\d)?abc(?(1)\d|abc)','abcabc'))<_sre.SRE_Match object; span=(0, 6), match='abcabc'>#匹配成功
再做如下尝试:

>>>print(re.search(r'(\d)+abc(?(1)\d|abc)','abcabc'))None#匹配失败
>>>print(re.search(r'(\d)*abc(?(1)\d|abc)','abcabc'))<_sre.SRE_Match object; span=(0, 6), match='abcabc'>#匹配成功
>>>print(re.search(r'(\d){1,}abc(?(1)\d|abc)','abcabc'))
None#匹配失败
>>>print(re.search(r'(\d){0,}abc(?(1)\d|abc)','abcabc'))<_sre.SRE_Match object; span=(0, 6), match='abcabc'>#匹配成功
似乎可以发现规律,如果id为1的组匹配数不允许为0个的话,当其匹配过程中匹配为0的话规则就会匹配失败。


3.结论

在python3中,执行命令'help(re)',可以看到关于(?(id/name)yes|no)的说明:“Matches yes pattern if the group with id/name

matched,the (optional) no pattern otherwise.”

所以我们可以理解为,当该特殊规则中的作为判断条件的组本身不允许为空的时候,在该组对目标字符串匹配为空的情况下,

整体规则匹配失败,所以后面的作为整体一部分的特殊规则自然也就无效了。所以要想特殊规则的no-pattern生效,必须判断条件对

组匹配数可以为0。

原创粉丝点击