Python3正则表达式之:(?(id/name)yes-pattern|no-pattern)条件性匹配
作者:wdc 发布时间:2022-04-09 14:46:32
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会被认为匹配不成功,继续执行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匹配的内容
来源:https://www.pythontab.com/html/2019/pythonhexinbiancheng_0719/1463.html
猜你喜欢
- 一直以来,每次调用Ajax方法都需要创建一次 Microsoft.XMLHTTP 对象,今天在使用Ajax技术做一个类似聊天室的
- 本文实例讲述了js+css实现有立体感的按钮式文字竖排菜单效果。分享给大家供大家参考。具体如下:这是一款较不错的竖排菜单,有立体感效果的菜单
- 前言:在前面一些文章中,经常能看到介绍某某参数的作用,可能有些小伙伴仍搞不清楚 MySQL 参数是啥。本篇文章我们来聊聊 MySQL 参数,
- 本文实例总结了PHP中非常有用却鲜有人知的函数。分享给大家供大家参考,具体如下:PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函
- 下载Git安装文件:GIt官网下载地址:Git-2.6.3-64-bit.exe然后就进入了Git的安装界面,如图:Git安装界面和Node
- 原问题:https://stackoverflow.com/questions/48122744/how-to-download-all-f
- 代码如下:<% '隐藏并修改文件的最后修改时间的aspshell '原理:通过FSO可以修改文件的
- 本文实例讲述了Vue插槽原理与用法。分享给大家供大家参考,具体如下:1 插槽内容Vue 实现了一套内容分发的 API,这套 API 基于当前
- 上周想要取得iframe中的元素和js变量值,一直没取得,查资料得知:不能用$(document).ready()方法,而是要用$(&quo
- 查询重写插件从MySQL 5.7.6开始,MySQL Server支持查询重写插件,可以在服务器执行之前检查并可能修改服务器接收的语句。以下
- 一.Numpy库1.什么是numpy?numpy是python进行科学计算的一个基础软件包,他是一个python库,提供多维数组
- 想学习Python3,但是暂时又离不开Python2。在Windows上如何让它们共存呢?目前国内网站经常会让大家把其中一个python.e
- 一、介绍使用pandas.DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线,默认按照列columns的名称在适当的位置
- 1、Node.js的单线程 非阻塞 I/O 事件驱动在 Java、PHP 或者.net 等
- 1、引言选择排序里面主要讲了三个排序,分别是简单选择排序、树形选择排序、堆排序。今天这篇文章主要讲树形选择排序,树形选择排序也被称为锦标赛排
- os.system()在shell中执行一条命令。函数原型如下:它是最简单的调用系统应用的方式,下面是一个例子:import osimpor
- 上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多,直接一点的可
- 一、前言很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。今天我们就
- 1、在file->settings->file and code templates->python script即可自定
- 前言:在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量