可以通过用括号包围正则表达式的部分来创建组,意味着一个组可以作为元字符(例如*或?)的参数。
import re
pattern = r"egg(spam)*"
if re.match(pattern, "egg"):
print(" Match 1")
if re.match(pattern, "eggspamspamspamegg"):
print(" Match 2 ")
if re.match(pattern, "spam"):
print(" Match 3 ")
........................................................................
Match 1
Match 2
上面例子(spam)表示捕获组
可以使用group函数访问捕获组中组的内容。group(0)或group()返回全部匹配,group(n)调用n大于0返回第n组匹配。group()返回一个包含所有捕获组的元组。
import re
pattern = r"a(bc)(de)(f(g)h)i"
match = re.match(pattern, "abcdefghijklmnop")
if match:
print(match.group())
print(match.group(0))
print(match.group(1))
print(match.group(2))
print(match.groups())
................................................................................
abcdefghi
abcdefghi
bc
de
('bc', 'de', 'fgh', 'g')
捕获组同时可以嵌套,也就是说一个组可以是另一个组的子集
有一些特殊的捕获组,它们叫非捕获组和命名捕获组。
命名捕获组的格式是(?P<name>...),其中name是组的名称,...是要匹配的表达式。它们的行为与正常组完全相同。除了可以通过索引访问还可以通过group(name)方式访问它们。
非捕获组的格式是(?:....)。非捕获组值匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。
import re
pattern = r"(?P<first>abc)(?:def)(ghi)"
match = re.match(pattern, "abcdefghi")
if match:
print(match.group("first")) # 命名捕获组
print(match.groups()) # 非捕获组则不捕获结果
..........................................................................
abc
('abc', 'ghi')
元字符 |
|元字符,匹配或的意思。例如red|blue表示匹配red或者blue
import re
pattern = r"gr(a|e)y"
match = re.match(pattern , "gray")
if match:
print(" Match 1")
match = re.match(pattern, "grey")
if match:
print(" Match 2")
match = re.match(pattern, "griy")
if match:
print(" Match 3")
..................................................................................................
Match 1
Match 2