首页 > 代码库 > 正则表达式分组小记

正则表达式分组小记

说是小记,主要是怕忘记了。

一个正则语法-命名分组

正则分组依赖圆括号,每个括号内的表达式是一个分组,为了避免,在一个完整的表达式中出现多个分组,依靠组序号获取组匹配项时的混乱,使用命名分组是很好地方法。

在.Net中语法为  (?<name>pattern)  其中尖括号(<>)可以使用单引号(‘‘)替换。

在Python中语法基本一致,只是在组名称前多了一个大写字母P  (?P<name>pattern)   不可以使用单引号替换尖括号。

以Python为例,如图

第一个表达式‘a.*b‘没有进行分组,那么匹配结果只有一个,所以只可以使用m.group(0),否则会报索引错误。

第二个表达式‘(a.*b)‘有分组,匹配结果和第一个一样,但是,它可以使用m.group(0)和m.group(1)。

原因是匹配结果中,m.group(0)是整个正则表达式的匹配结果,分组匹配结果从索引1开始。

所以,当有众多的分组时,获取某一分组的匹配项会很容易造成混乱。

使用命名分组

比如匹配这个字符串“1978年  sex:male ”

使用命名分组

  .Net(尖括号、引号都可以)  (?‘year‘\d{4}).*?sex:(?<gender>.*)

  Python   (?P<year>\d{4}).*?sex:(?P<gender>.*)

Python结果如下

此时既可以使用索引方式获取分组匹配项,当然更推荐的方式是使用分组命名获取对象匹配项,这样无论正则表达式多少个分组,均不需要考虑分组的索引,只要通过名称就可以获取到了。

 

另外一提

(?P<year>\d{4}).*?sex:(?P<gender>.*)

表达式中标红的意思是:(.)任意字符-(*)0个或多个-(?)最短匹配

就是说如果要匹配的字符串中有多个‘sex‘子串,该表达式会匹配到最先(最短)出现的那个‘sex‘