Python正则表达式命名捕获组和非捕获组
命名捕获组
的格式是 (?p<name>...),其中 name 是组的名称,...是要匹配的表达式。它们的行为与正常组完全相同,除了可以通过索引访问还可以通过 group(name) 方式访问它们。非捕获组的格式是 (?:...)。
import re pattern = r"(?P<python>123)(?:456)(789)" string = "123456789" match = re.match(pattern,string) if match: print(match.group("python")) print(match.groups())
123 ('123', '789')
非捕获组
非捕获组值匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。
import re pattern = r"(?P<python>123)(?:456)(789)" string = "123456789" match = re.match(pattern,string) if match: print(match.group("python"))#123 print(match.groups())#('123', '789') # 1.(?:pattern) : 匹配pattern,但不捕获匹配结果 s="industryOpqindustries" res=re.findall("industr(?:y|ies)",s) print(res)#['industry', 'industries'] # 2.(?=pattern): 零宽度正向预查(正向零宽断言),匹配后面跟的是pattern的内容,不匹配pattern,也不捕获匹配结果。 s="windows2019windows2018windows1989" res=re.sub("windows(?=2018|1989)","microsoft",s) print(res)#windows2019microsoft2018microsoft1989 # 3. (?!pattern): 零宽度负向预查(负向零宽断言),匹配后面跟的不是pattern的内容,不匹配pattern,不捕获匹配结果。 res=re.sub("windows(?!2018|1989)","microsoft",s) print(res)#microsoft2019windows2018windows1989 # 4.(?<=pattern): 零宽度正向回查(正向零宽断言),匹配前面是pattern的内容,不匹配pattern,不捕获匹配结果。 s="windows2019microfost2019" res=re.sub("(?<=microfost)2019","pattern",s) print(res)#windows2019microfostpattern # 5.(?<!pattern): 零宽度负向回查(负向零宽断言),匹配前面不是pattern的内容,不匹配pattern,不捕获匹配结果。 res=re.sub("(?<!microfost)2019","pattern",s) print(res)#windowspatternmicrofost2019