Python3正则表达式之:(?(id/name)yes-pattern|no-pattern)条件性匹配
本文详细解析Python3正则表达式中的条件匹配语法(?(id/name)yes-pattern|no-pattern)。文章阐述了该语法的用途、参数含义及具体语法结构,并通过多个代码实例深入探讨了有组和无组、匹配成功与失败时的不同执行路径,最后总结了该特殊规则生效的关键条件及输出结果。
1. 用途
正则表达式中(?(id/name)yes-pattern|no-pattern)的功能如下:
首先,尝试匹配由
id或name指定的条件,并执行yes-pattern部分的匹配逻辑;若
id或name所代表的条件未得到满足,则转而匹配no-pattern部分的内容;
这一描述可能较为晦涩,初学者或许难以一次性完全理解。
2. 参数含义
这里的name或id,指的是在当前条件匹配位置之前,通过分组(group)所捕获的内容。
关于name:若存在命名分组,即使用了named group,则该分组拥有对应的name,此处的name即指代该分组的名称;
关于id:若为无命名分组,即使用了unnamed group,则该分组拥有对应的编号,称为group的number,亦即id,此处的id即指代该分组的编号;
关于yes-pattern:若前面的group匹配成功,则执行yes-pattern的匹配;
关于no-pattern:若前面的group匹配失败,即未找到符合该group的内容,则执行no-pattern的匹配;
注意:上述yes-pattern和no-pattern均为普通的正则表达式,用于匹配所需的具体内容。
3. 语法
若存在no-pattern,则前面需有一个竖杠'|',用于分隔yes-pattern和no-pattern;
若无需匹配no-pattern的部分,则可连同'|'一起省略不写。
实例展示:
>>> re.search(r'(\d+)?(?(1)\w+|jb51\.\w+)', 'jb51.com')>>> re.search(r'(\d+)?(?(1)\w+)', '100jb51')
其中?(1)代表序号为1的group,即前文提到的(\d+);第二个表达式中未使用no-pattern。
4. 用法详解
基于上述示例进行变换,通过实例深入探索其详细用法及技巧。
4.1 移除(\d+)后的问号,即要求group 1必须存在,而非可选。
执行结果:
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', 'jb51.com')
>>>
整体规则匹配失败,返回空值,no-pattern部分未按预期执行。
4.2 修改匹配字符串。
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', '1jb51.com')
此时可以匹配到,group1和yes部分均匹配成功。
4.3 group可有可无的情况(group后增加问号)。
>>> re.search(r'(\d+)?(?(1)\w+|jb51\.\w+)', 'jb51')
>>>
若group未匹配到,且该group为可选(可有可无),则group被视为匹配不成功,继续执行no-pattern部分的匹配。
4.4 仅匹配group 1部分,yes部分未匹配。
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', '1000')
仅匹配group 1部分,即使yes部分未匹配,仍有匹配结果,这说明yes-pattern和no-pattern并非必须都匹配成功。
5.结论
1. 通过对比4.1、4.2和4.3可以发现:
当该特殊规则中作为判断条件的组本身不允许为空时,若该组对目标字符串匹配为空,则整体规则匹配失败,因此作为整体一部分的特殊规则自然无效。所以,要想特殊规则的no-pattern生效,必须确保判断条件对应组的匹配数可以为0。
2. 通过4.4可知:可以仅匹配group部分,如果yes-pattern和no-pattern没有匹配到,则会仅输出group匹配的内容。
更多关于Python3正则表达式的相关教程请查看下面的相关链接
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













