第11.21节 Python 中正则表达式的其他扩展功能

一、 引言
在《第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用》中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中正则表达式的扩展功能非常多,所有扩展功能都是在左括号后面跟问号“?”来表示,具体扩展功能是要看问号后面的字符来确认,如“P”表示组名相关扩展。
下面老猿将未介绍的主要正则表达式扩展功能在本节进行介绍,下面介绍的扩展功能中的“…”都表示一个合法的子模式正则表达式。

二、 (?#…) 注释
表示右括号前面的内容都是注释,正则表达式处理时将忽略这部分内容。

三、 (?aiLmsux) 内联标记
内联标记与《第11.2节 Python 正则表达式支持函数概览》介绍的参数flags搜索标记的作用是类似的。

内联标记中的“aiLmsux”为可以使用的标记字符集合,匹配时可以选择填入其中的一个或多个,这个搜索标记本身不匹配任何搜索串的内容,只是为了搜索控制的。这些字符与搜索标记的对应关系如下:
a: re.A ,表示只匹配ASCII字符
i: re.I ,表示匹配忽略大小写;
L: re.L ,表示语言依赖;
m: re.M ,多行模式;
s: re.S、re.DOTALL,点匹配全部字符;
u: re.U ,Unicode匹配,由于Python3都是Unicode匹配,因此该标记基本没有什么用;
x: re.X ,冗长模式,允许编写更友好的正则表达式。

这些标记可以组合使用,包含这些标记的正则表达式,可以免去了在 调用相关函数时传递 flag 参数。注意:标记应该在整个正则表达式字符串首位表示,是对整个正则表达式生效。

四、 (?:…)
正则括号组匹配模式的非捕获版本, 匹配在括号内的任何正则表达式,但该分组所匹配的子字符串 不能 在执行匹配后被获取或是之后在模式中被引用。

五、 (?(id/name)yes-pattern|no-pattern)条件性匹配
如果给定的 组序号 或 组名存在,将会去匹配 yes-pattern对应子正则表达式 ,否则就去匹配 no-pattern对应正则表达式,no-pattern 可选,也可以被忽略。
案例:

>>> re.search(r'(<)?(w+@w+(?:.w+)+)(?(1)>|$)','<LaoYuanPython@csdn.com>')
<re.Match object; span=(0, 24), match='<LaoYuanPython@csdn.com>'>
>>> re.search(r'(<)?(w+@w+(?:.w+)+)(?(1)>|$)','(LaoYuanPython@csdn.com')
<re.Match object; span=(1, 23), match='LaoYuanPython@csdn.com'>
>>> re.search(r'(<)?(w+@w+(?:.w+)+)(?(1)>|$)','(LaoYuanPython@csdn.com)')
>>> re.search(r'(<)?(w+@w+(?:.w+)+)(?(1)>)','(LaoYuanPython@csdn.com)')
<re.Match object; span=(1, 23), match='LaoYuanPython@csdn.com'>

上述正则表达式正常匹配的含义是:当组号1(匹配’<’)匹配成功时,要求搜索串以”>”结束,当组号1未匹配时,要求域名后面不能有任何其他字符。

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643618.html