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部分的内容;

假如idname条件不满足,则去匹配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-patternno-pattern,都是一般的正则表达式,用来匹配所需的内容。

3. 语法

假如存在no-pattern,则前面要有个竖杠’|’,用来分隔yes-patternno-pattern

假如不想匹配no-pattern的部分,则能够连同'|'一同不写。

实例:

>>> re.search(r'(\d+)?(?(1)\w+|pythontab\.\w+)', 'vztug.com')>>> re.search(r'(\d+)?(?(1)\w+)', '100pythontab')


其间的?(1)代表序号为1的group, 也便是上面(\d+), 第二个表达式中就没有运用no-pattern

4. 用法详解

仍是上面的比如, 咱们改换一下, 用实例探究它们的具体用法及技巧


4.1 把(\d+)后边的问号去掉, 也便是说有必要存在group 1,不是可有可无

履行:

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\w+)', 'vztug.com')
>>>

全体规矩匹配失利,回来为空,no-pattern部分并没有依照料想履行。


4.2 改一下匹配字符串

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\w+)', '1vztug.com')

能够匹配到, group1和yes部分都匹配到了


4.3 group可有可无的状况(group后添加问号)

>>> re.search(r'(\d+)?(?(1)\w+|pythontab\.\w+)', 'pythontab')
>>>

假如group没有匹配到,且它可有可无, 那么group会被认为匹配不成功,持续履行no-pattern部分匹配


4.4 只匹配group 1 部分, yes部分没有匹配

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\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-patternno-pattern没有匹配到, 则会仅输出group匹配的内容


上一篇:python json.dumps中文乱码问题解决
下一篇:最终一页

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854