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

 

posted @ 2020-07-28 00:31  腹肌猿  阅读(2236)  评论(0编辑  收藏  举报