捕获组
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个捕获组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为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
非捕获组
非捕获组只匹配结果,但不捕获结果,也不会分配组号。
- (?: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