美文网首页
正则表达式之捕获组和非捕获组

正则表达式之捕获组和非捕获组

作者: Cindy小隐 | 来源:发表于2018-09-20 16:35 被阅读0次

捕获组

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个捕获组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 也可以自己指定子表达式的组名。这样在表达式或程序中可以直接引用组名,当然也可以继续使用组号。但如果正则表达式中同时存在普通捕获组和命名捕获组,那么捕获组的编号就要特别注意,编号的规则是先对普通捕获组进行编号,再对命名捕获组进行编号。详细语法如下:

1.(pattern): 匹配pattern并捕获结果,自动设置组号。e.g.

(abc)+d :  匹配到abcd或者abcabcd

2.(?<name>pattern)或(?'name'pattern) : 匹配pattern并捕获结果,设置name为组名。
3.\num: 对捕获组的反向引用。其中 num 是一个正整数。e.g.

(\w)(\w)\2\1: 匹配到abba

4.\k< name >或\k' name ' : 对命名捕获组的反向引用。其中 name 是捕获组名。e.g.

(?<group>\w)abc\k<group>  : 匹配到xabcx

非捕获组

非捕获组只匹配结果,但不捕获结果,也不会分配组号。

  1. (?:pattern) : 匹配pattern,但不捕获匹配结果。e.g.:
industr(?:y|ies)
可以匹配到'industry'或'industries'

2.(?=pattern): 零宽度正向预查(正向零宽断言),匹配后面跟的是pattern的内容,不匹配pattern,也不捕获匹配结果。e.g.

Windows(?=95|98|NT|2000)
能匹配到"Windows2000" 中的 "Windows"
不能匹配到 "Windows3.1" 中的 "Windows"

3.(?!pattern): 零宽度负向预查(负向零宽断言),匹配后面跟的不是pattern的内容,不匹配pattern,不捕获匹配结果。e.g.:

Windows(?!95|98|NT|2000)
能匹配 "Windows3.1" 中的 "Windows"
不能匹配 "Windows2000" 中的 "Windows"

4.(?<=pattern): 零宽度正向回查(正向零宽断言),匹配前面是pattern的内容,不匹配pattern,不捕获匹配结果。e.g.

(?<=Office|Word|Excel)2000
能匹配 " Office2000" 中的 "2000"
不能匹配 "Windows2000" 中的 "2000"

5.(?<!pattern): 零宽度负向回查(负向零宽断言),匹配前面不是pattern的内容,不匹配pattern,不捕获匹配结果。e.g.:

(?<!Office|Word|Excel)2000
能匹配 " Windows2000" 中的 "2000"
不能匹配 " Office2000" 中的 "2000"

正则表达式中的注释

(?#comment) :这种类型的分组不对正则表达式的处理产生任何影响

python对于非捕获组的支持

python中的re模块可以支持上述非捕获组1、2、3样式的正则,但是不支持4、5样式的正则,4、5样式的正则会报错“sre_constants.error: look-behind requires fixed-width pattern”,意思是“回查需要定长的模式”,所谓定长,如“(?<=Office.{4})2000”即为定长,“(?<=Office.*)2000”即为不定长;
4样式的正则可以改写为:(?:(?<=Office)|(?<=Word)|(?<=Excel))2000"。

整理自:http://www.cnblogs.com/wuhong/archive/2011/02/18/1957017.html

相关文章

网友评论

      本文标题:正则表达式之捕获组和非捕获组

      本文链接:https://www.haomeiwen.com/subject/yzjnnftx.html