正则表达式之括号

正则表达式(三)

  括号

   分组

  量词可以作用字符或者字符组后面作为限定出现次数,如果是限制多个字符出现次数或者限制一个表达式出现次数,需要使用括号()将多个字符或者表达式括起来,这样便称为分组。例如(ab)+表示“ab”字符串重复出现一次以上,ab+表示字符b重复出现一次以上。

  分组应用:匹配一个长度为15到18的数字字符串,使用正则表达式d{15,18};匹配一个长度为15或18的数字字符串,使用正则表达式d{15}(d{13})?。

  多选结构

  多选结构的形式是(...|...),在括号内以竖线分隔开多个表达式,每个表达式被称为多选分支,多选分支的数目是没有限制的。匹配过程中,整个多选结构看做一个整体,只要其中一个多选分支能够匹配,则整个多选结构匹配成功。反之,所有多选分支不能匹配则匹配失败。

  继分组应用中问题来说,匹配一个长度为15或者18的数字字符串,使用正则表达式d{15}(d{13})?可以实现,使用多选结构(d{15}|d{18})也可以轻松实现。

  多选结构应用:匹配月份,使用正则表达式(0?[1-9]|1[012]),匹配日,使用正则表达式(0?[1-9]|1[0-9]|2[0-9]|3[01])。

  分组是对字符串特性的抽象合并,多选结构是对字符串特性的具象罗列。

  引用分组

  分组可以保存每个分组的匹配文本,匹配完成以后,通过group(num)方法引用分组在匹配过程中捕获的匹配文本。其中num表示对应括号的编号,括号分组的编号自左向右,由1开始计数。一般来说,正则表达式匹配完成以后,会返回一个结果对象,对结果对象调用group()方法,并传入所需分组的编号,即可获得所需分组的匹配文本内容。如python而言,re.search()返回一个MatchObject对象,判定MatchObject对象是否为None,可以验证匹配是否成功;对MatchObject对象调用group()方法可以回去对象中匹配文本的内容。

  num = 1,2,3,...MatchObject.group(num)表示获取对应括号分组编号匹配的内容。

  num = 0,MatchObject.group(0)表示获取整个表达式匹配的内容。

  反向引用:在正则表达式内部引用之前捕获分组匹配的文本,形式为 um,使用正则表达式([a-z])1可以表示两个连续重复的字母,其中num为1是指分组([a-z])的编号,1表示对其匹配结果的引用。

  注意正则表达式:(cat)s+1,1是对匹配文本cat的反向引用,但是1表示匹配cat不含左右边界的单词,也会匹配cater,dedicate等单词。

  命名分组

  分组可以通过括号编号来调用,但是括号多了容易混淆,因此采用命名分组,对不同分组采取不同的命名,在调用时也会简单方便。python中命名分组的方式为(?P<name>...),例如对分组(d{4})命名为(?P<year>d{4}),调用时使用group(name),如group(year)获取匹配文本内容。

  反向引用:使用了命名分组,在正则表达式中反向引用时,必须使用(?P=name)的记法。

  非捕获分组

  前面提到了分组的多重用法,如普通分组、多选结构、引用分组,这些都是需要使用括号构成分组的,一旦构成分组,就会对分组匹配的文本信息进行保存。有一些匹配文本是我们不需要的,我们就可以设置分组为非捕获分组,格式为(?:...),如(?:d{4})。在引用分组和非捕获分组交叉出现时,非捕获分组不会占用分组编号。

  

原文地址:https://www.cnblogs.com/snow-lanuage/p/10536168.html