正则表达式分组小记
说是小记,主要是怕忘记了。
一个正则语法-命名分组
正则分组依赖圆括号,每个括号内的表达式是一个分组,为了避免,在一个完整的表达式中出现多个分组,依靠组序号获取组匹配项时的混乱,使用命名分组是很好地方法。
在.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'
看到一篇非捕获组的博客,简单易懂,详细点击这里