第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式

一、 什么是组
关于组匹配模式,Python官网上说得比较简单,也没有这个名词,只有组这个名词,老猿查了比较多的资料和做了相关测试之后才理解。

组匹配模式,就是在匹配的正则表达式中使用小括号“()”括起来的任意一个合法的匹配模式串,左括号标记组的起点,右括号标记组的终点,即组匹配模式定义为:

(组匹配模式串)

其中组匹配模式串是整个正则表达式的一个子匹配模式。在一个正则表达式内可以定义多个组,每个组都有一个顺序分配的序号(组还可以命名),其中组0为整个正则表达式,组1为第一个括号,组2为第二个括号,依次类推顺序分配…,最多99个组号。其中组0为所有正则表达式都默认的就是整个正则表达式,不论正则表达式是否使用组匹配模式。

《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》介绍的这些搜索函数,其返回值都是一个匹配对象,匹配对象中存储的就是搜索结果,搜索结果保存在匹配对象的组属性中,使用“匹配对象.group(组序号)”、“匹配对象.groups()”等方式可以访问,这个匹配对象的组及其序号就是与正则表达式中的组一一对应。

之所以称为组,老猿认为有如下原因:

  1. 这种标识的组在整个匹配模式表达式在组后面的串中可以通过组名或组序号来引用;
  2. 其与搜索文本的匹配结果可以通过匹配对象的group(组序号)等方式来访问;
  3. 可以在组内定义类似《第11.2节 Python 正则表达式支持函数概览》中搜索函数中的搜索标记参数的搜索控制符,且搜索控制符的作用域只对该组有影响。

在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》介绍的这些搜索函数,其返回值都是一个匹配对象,匹配对象中存储的就是搜索结果,搜索结果保存在匹配对象的组属性中,使用“匹配对象.group(组序号)”、“匹配对象.groups()”等方式可以访问。

二、 案例

  1. 定义2个组:
>>> pattern='<h1 class="name">(.*)</h1><h1 class="age">([0-9]{1,3})</h1>'
>>> str='<h1 class="name">LaoYuanPython</h1><h1 class="age">28</h1>'
>>> m=re.search(pattern,str)
>>> m.groups()
('LaoYuanPython', '28')
>>> m.group(0) 
'<h1 class="name">LaoYuanPython</h1><h1 class="age">28</h1>'
>>> m.group(1)
'LaoYuanPython'
>>> m.group(2)
'28'
>>>
  1. 组允许嵌套,如组A内可以嵌套组B,则嵌套的B组其组的序号在A的序号后面,但在A后面组的序号前面。如:
>>>pattern='<h1 class="name">(.*(P.?thon))</h1><h1 class="age">([0-9]{1,3})</h1>' 
>>> str='<h1 class="name">LaoYuanPython</h1><h1 class="age">28</h1>'
>>> m=re.search(pattern,str)
>>> m.groups()
('LaoYuanPython', 'Python', '28')
>>> m.group(1)
'LaoYuanPython'
>>> m.group(2)
'Python'

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643630.html