通常情况下,分组是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。分组有一个例外的情况,分组也可以不使用圆括号,而是使用 | 元字符来表示分组,| 的两侧是两个分组。
当使用圆括号表示分组时,从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个"("表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。默认情况下,正则表达式为每个分组自动分配一个组号,规则是:组号从1开始,从左向右,组号依次加1(base+1),例如,第一个分组的组号为1,第二个分组的组号为2,以此类推。
分组不仅有编号,还能为分组设置别名,在Python中,使用(?P<name>exp)为正则表达式exp设置别名。
匹配分组的元字符:
- exp1 | exp2 :匹配exp1 或 exp2
- (exp):把括号内的正则作为一个分组
- (?P<name>exp):定义一个分组,并为分组起别名,分组的正则是exp
- (?P=name):引用别名为name的分组
- \num:使用分组的编号来引用分组,分组按照正则表达式中出现的顺序编号1、2、3、...
一,分组引用
分组引用,是指在表达式中,重复使用正则表达式,使正则表达式的写法更简洁。
分组定义的三种形式:
- (exp) :自动分配组号,通过分组号引用该分组;
- (?P<name>exp) :命名分组,通过分组名引用该分组;
- (?:exp) :该分组只在当前位置匹配文本,在该分组之后,无法引用该分组,该分组没有分组名,也没有分组号;
1,通过组号引用分组
在正则表达式前面定义一个分组(exp),在表达式的后面,能够通过组号引用该分组的表达式,引用分组的语法是:\group_number;
例如:\b(\w+)\b\s+\1\b,在该正则表达式中,只存在一个分组(\w+),组号是1,在该分组的后面,使用\1来引用该分组,将\1替换为分组的子表达式,等价于:\b(\w+)\b\s+(\w+)\b。
2,通过分组名引用分组
在正则表达式中,能够对分组命名,命名的分组格式:(?P<name>exp),分组名是name,通过name来引用该分组的格式是:(?p=group_name),通过分组名和组号引用分组,其文本匹配的行为是一样的。
例如:\b(?P<word>\w+)\b\s+(?P=word)\b,在该分组的后面中,使用(?P=word)引用该分组,把(?P=word)替换为分组的子表达式,等价于:\b(\w+)\b\s+(\w+)\b。
3,无法引用的分组
(?:exp):使用这种语法定义的分组,不能引用,只能在当前的位置匹配文本,正则表达式不为该分组自动分配组号。
二,匹配分组的示例
下面使用Python的re模块来演示如何使用分组。
1,匹配任意分组
>>> out=re.match(‘[0-9]?\d$|100‘,‘08‘) >>> out <re.Match object; span=(0, 2), match=‘08‘>
2,使用()定义分组
>>> out=re.match(‘\w{4,20}@(163|qq|126)\.com‘,‘[email protected]‘) >>> out <re.Match object; span=(0, 11), match=‘[email protected]‘>
3,为分组命名,并通过别名来引用分组
>>> out=re.match(r"<(?P<name1>\w*)><(?P<name2>h[1-5])>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.com</h1></html>") >>> out <re.Match object; span=(0, 35), match=‘<html><h1>www.baidu.com</h1></html>‘>
参考文档:
原文地址:https://www.cnblogs.com/ljhdo/p/10678281.html