正则表达式 第三篇:分组匹配

Posted ljhdo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式 第三篇:分组匹配相关的知识,希望对你有一定的参考价值。

通常情况下,分组是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。分组有一个例外的情况,分组也可以不使用圆括号,而是使用 | 元字符来表示分组,| 的两侧是两个分组。

当使用圆括号表示分组时,从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个"("表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是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>>

 

参考文档:

Python 正则表达式(匹配分组)

以上是关于正则表达式 第三篇:分组匹配的主要内容,如果未能解决你的问题,请参考以下文章

python成长之路第三篇_正则表达式

正则表达式第三回--模式分组与前瞻

使用正则表达式分组结构匹配部分字符串

javascript 正则表达式之分组与前瞻匹配详解

攻破难啃的骨头-正则表达式(转)

偷学Python第三十一天:Python正则表达式的语法以及re模块的使用