Python3正则表达式之:(?(id/name)yes-pattern|no-pattern)条件性匹配

Dylan
Dylan
发布时间:2026-10-14 | 4人浏览过
原创

本文详细解析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正则表达式的相关教程请查看下面的相关链接

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表