Python:正则表达式-5

本笔记转自FishC

扩展语法

Perl的开发者使用(?...)作为扩展语法。问好?紧跟在左边小括号,因为?前边没有东西可以重复就避免了兼容性问题,紧跟在?后边的字符则表示哪些扩展语法会被使用。

Python支持Perl的一些扩展语法,并且在此基础上增加了一个扩展语法。如果紧跟在问好?后边的是P,那么可以肯定这是一个Python的扩展语法。

1)非捕获组

有时我们需要用一个组来表示部分正则表达式,但并不需要这个组去匹配任何东西,这是可以通过非捕获组来明确表示意图。非捕获组的语法是(?:...),这个...可以替代为任何正则表达式。

除了不能从非捕获组获得匹配的内容外,其他的非捕获组跟普通子组没有什么区别了。我们可以在里边放任何东西,使用重复功能的元字符,或者跟其他子组进行嵌套(捕获的或非捕获组)。

添加一个非捕获组并不影响其他捕获组的序号,在搜索速度上,捕获组合肥捕获组的速度没有任何区别。

2)命名组

普通子组通过序列来访问它们,命名组则可以使用一个有意义的名字来进行访问。

命名组的语法是Python特有的扩展语法:(?P<name>); <>里边的name就是命名组的名字;命名组除了有一个名字标识之外,跟其他捕获组是一样的。

匹配对象的所有方法不仅可以处理那些有数字引用的捕获组,还可以处理通过字符串引用的命名组;除了使用名字访问,命名组依旧可以使用数字序号进行访问。

命名组非常好用,因为它让我们可以使用一个好记的名字代替一些毫无意义的数字。

正则表达式中,反向引用的语法像(...)\1是使用序号的方式来访问子组;在命名组里,也有对应的变体:使用名字来代替序号。其扩展语法是(?P=name),含义是该name指向的组需要在当前位置再次引用。那么搜素两个单词的正则表达式可以写成(\b\w+)\s+\1,也可以写成(?P<word>\b\w+)\s+(?P=word):

前向断言

另外一个零宽断言是前向断言,它又可分为前向肯定断言和前向否定断言两种形式。

1)(?=...)

前向肯定断言。如果当前包含的正则表达式(这里以...表示)在当前位置匹配成功,则代表成功,否则失败。一旦该部分正则表达式被匹配引擎尝试过,就不会继续进行匹配;剩下的模式在此断言开始的地方继续尝试。

2)(?!...)

前向否定断言,这与前向肯定断言相反(不匹配则表示成功,匹配表示失败)。

(看实例,发现还是晦涩难懂啊!)



猜你喜欢

转载自blog.csdn.net/huan_126/article/details/80258669