如果一个模式字符串中有一对圆括号括起来的部分,那么这部分就会作为一组,可以通过group
方法的参数获取指定的组匹配的字符串。当然,如果模式字符串中没有任何用圆括号括起来的部分,那么就不会对待匹配的字符串进行分组。
m = re.match(r'(\d\d\d)-(\d\d)','123-45')
在上面的代码中,模式字符串可以匹配以3个数字开头,后面跟着一个连字符(-),最后跟着2个数字的字符串。由于"\d\d\d"和"\d\d"都在圆括号中,所以这个模式字符串会将匹配成功的字符串分成两组,第1组的值是"123",第2组的值是"45",m.group(1)会获取第1个分组值,m.group(2)会获取第2个分组值。如果模式字符串改成下面的形式,虽然可以匹配"123-45",但"123-45"并没有被分组。
m = re.match(r'\d\d\d-\d\d','123-45')
[例 11.7] 本例演示了正则表达式中分组的各种情况
import re
m = re.match(r'(\d{3})-(\d{4})-([a-z]{2})','123-4567-xy')
if m is not None:
print(m.group())
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.groups())
print('--------------------')
m = re.match(r'(\d{3}-\d{4})-([a-z]{2})','123-4567-xy')
if m is not None:
print(m.group())
print(m.group(1))
print(m.group(2))
print(m.groups())
print('--------------------')
m = re.match(r'\d{3}-\d{4}-([a-z]{2})','123-4567-xy')
if m is not None:
print(m.group())
print(m.group(1))
print(m.groups())
print('--------------------')
m = re.match(r'\d{3}-\d{4}-[a-z]{2}','123-4567-xy')
if m is not None:
print(m.group())
print(m.groups())
输出结果:
123-4567-xy
123
4567
xy
('123', '4567', 'xy')
--------------------
123-4567-xy
123-4567
xy
('123-4567', 'xy')
--------------------
123-4567-xy
xy
('xy',)
--------------------
123-4567-xy
()
使用分组要了解如下几点:
group
方法获取指定的组的值时,组从1开始。也就是说,group(1)获取第1组的值,group(2)获取第2组的值,以此类推。groups
方法用于获取所有组的值,以元组形式返回。所以除了使用group(1)获取第1组的值外,还可以使用groups()[0]获取第1组的值,groups()[1]获取第2组的值,以此类推。