Python进阶之路 高级编程 正则表达式-分组

分组

如果一个模式字符串中有一对圆括号括起来的部分,那么这部分就会作为一组,可以通过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
()

使用分组要了解如下几点:

  • 只有圆括号括起来的部分才算一组,如果模式字符串中既有圆括号括起来的部分,也没有被圆括号括起来的部分,如"\d{3}-\d{4}-([a-z]{2})",那么只会将被圆括号括起来的部分算作一组,其他的部分忽略。
  • group方法获取指定的组的值时,组从1开始。也就是说,group(1)获取第1组的值,group(2)获取第2组的值,以此类推。
  • groups方法用于获取所有组的值,以元组形式返回。所以除了使用group(1)获取第1组的值外,还可以使用groups()[0]获取第1组的值,groups()[1]获取第2组的值,以此类推。

你可能感兴趣的:(Python,Python进阶之路)