码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式分组小记

时间:2014-06-21 09:20:41      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   com   使用   

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

一个正则语法-命名分组

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

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

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

以Python为例,如图

bubuko.com,布布扣

第一个表达式‘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结果如下

bubuko.com,布布扣

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

 

另外一提

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

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

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

 

 

正则表达式分组小记,布布扣,bubuko.com

正则表达式分组小记

标签:style   blog   http   color   com   使用   

原文地址:http://www.cnblogs.com/wang-shuai/p/3795059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!