分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个 左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则 表达式。分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。
1 # 匹配区号 2 phone = '0713-2875338' 3 result = re.match(r'(\d{3}|\d{4})-(\d{7})$', phone) 4 print(result) # >> <re.Match object; span=(0, 12), match='0713-2875338'> 5 print(result.group(1)) # >> 0713 6 print(result.group(2)) # >> 2875338
1 result = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$', msg1) # \1表示和第一组的一样 2 print(result) # >> <re.Match object; span=(0, 14), match='<h1>hello</h1>'> 3 print(result.group(1)) # >> h1 4 print(result.group(2)) # >> hello
1 msg = '<html><h1>hello</h1></html>' 2 result = re.match(r'<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</\2></\1>$', msg) # \2表示和第二组<([0-9a-zA-Z]+)>匹配一样,\1表示和第一组<([0-9a-zA-Z]+)>匹配一样 3 print(result) # >> <re.Match object; span=(0, 27), match='<html><h1>hello</h1></html>'> 4 print(result.group(1)) # >> html 5 print(result.group(2)) # >> h1 6 print(result.group(3)) # >> hello
上面所用到的\1和\21...用起来很混乱,所以怎么解决呢? 可以用(?P<命名>) 后面引用(?P=命名)
1 msg = '<html><h1>hello</h1></html>' 2 result = re.match(r'<(?P<name1>[0-9a-zA-Z]+)><(?P<name2>[0-9a-zA-Z]+)>(.+)</(?P=name2)></(?P=name1)>', msg) 3 print(result) # >> <re.Match object; span=(0, 27), match='<html><h1>hello</h1></html>'> 4 print(result.group(1)) # >> html 5 print(result.group(2)) # >> h1 6 print(result.group(3)) # >> hello