一、 引言

《第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式》介绍了组匹配模式,在一个正则表达式内可以定义多个组,每个组都有一个顺序分配的序号,并且在代表匹配结果的匹配对象中能通过组序号去访问每个组的匹配结果。除了这种组序号访问方式之外,re模块还支持在匹配模式串中给组命名,并通过组名去访问组相关匹配数据,这就是正则表达式处理的命名组功能。

二、 语法

组命名的语法是在组匹配模式基础上扩展的,是在组的括号起始部分增加“?P<组名>”,这样组的定义语法为:

(?P<组名>组匹配模式串)

其中:

  1. ?:表示组匹配模式的扩展模式;
  2. P:组名扩展标示,表示后面为组名,注意P必须是大写字母,小写字母不被re模块作为组名扩展标示;
  3. <>:表示里面的内容为组名;
  4. 组名:必须是有效的Python标识符,并且每个组合名在一个正则表达式内只能定义一次,即在同一个正则表达式内组名不能重复。

例子:

>>> pattern='<h1 class="name">(?P<name>.*)</h1><h1 class="age">(?P<age>[0-9]{1,3})</h1>'

上面例子中定义了2个组名,分别为name和age,name为任意字,age必须为1-3位数字。

三、 组名的反向引用

定义组名肯定是为了使用组名,组名可以在多个地方使用,其中一个就是在正则表达式内被引用,这样引用的内容,表示匹配时,在定义和引用的地方都要出现相同的匹配字符串,这个功能称为组名的反向引用。其语法如下:

(?P=<组名>)

注意:

1、组名必须在引用前定义;

2、比定义在P和<组名>之间多了一个等号;

3、<组名>后没有其他子串。

组名的反向引用这个功能在XML标记语言解析是很有用,如:

<span class="read-count">阅读数: 410</span>

在这种XML标记语言的标签语句中,同一个标签包含开始标签和结束标签,其名字相同,只是结束标签多了反斜杠。此时要解析标签可以使用如下语句来确保匹配到开始标签和结束标签是同一个。可以使用如下方式解析:

>>> m=re.search(r'<(?P<label>[a-z]*)(.*)</(?P=label)>', '<span class="read-count">阅读数:410</span>')
>>> m
<re.Match object; span=(0, 39), match='<span class="read-count">阅读数:410</span>'>
>>> m.groupdict()
{'label': 'span'}
>>> m.groups()
('span', ' class="read-count">阅读数:410')
>>>

如果搜索文本中的结束标签不是“</span>”,则上述正则表达式与搜索文本无法匹配。

上述组名的反向引用,也可以通过组序号实现同样的功能,就是在引用的地方直接使用:

(\组序号)

\组序号
>>> m=re.search(r'<(?P<label>[a-z]*)(.*)</(\1)>', '<span class="read-count">阅读数:410</span>')
>>> m
<re.Match object; span=(0, 39), match='<span class="read-count">阅读数:410</span>'>
>>>

这种方式和组名反向引用的效果是相同的,组名反向引用容易理解也容易记忆,而序号方式的引用则更灵活,可以在前面不用定义组名,所有组都可以通过这种方式引用。如上诉匹配完全可以写成如下:

>>> m=re.search(r'<([a-z]*)(.*)</(\1)>', '<span class="read-count">阅读数:410</span>')
>>> m
<re.Match object; span=(0, 39), match='<span class="read-count">阅读数:410</span>'>
>>>

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


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

第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用的更多相关文章

  1. 第11.13节 Python正则表达式的转义符”\”功能介绍

    为了支持特殊元字符在特定场景下能表示自身而不会被当成元字符进行匹配出来,可以通过字符集或转义符表示方法来表示,字符集表示方法前面在<第11.4节 Python正则表达式搜索字符集匹配功能及元字符 ...

  2. 第11.4节 Python正则表达式搜索字符集匹配功能及元字符”[]”介绍

    Python正则表达式字符集匹配表示是指搜索一个字符,该字符在给定的一个字符的集合中.元字符'['和']'是用于组合起来定义匹配字符集,匹配模式中使用 '['开头,并使用']'结尾来穷举搜索的字符可能 ...

  3. 第11.15节 Python正则表达式转义符定义的特殊序列

    一. 引言 在前面<第11.13节 Python正则表达式的转义符"\"功能介绍>介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自 ...

  4. 第11.25节 Python正则表达式编译re.compile及正则对象使用

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  5. 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'

    在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...

  6. 第11.9节 Python正则表达式的贪婪模式和非贪婪模式

    在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...

  7. 第11.6节 Python正则表达式的字符串开头匹配模式及元字符“^”(插入符、脱字符)功能介绍

    符号"^"为插入符,也称为脱字符,在Python中脱字符表示匹配字符串的开头,即字符串的开头满足匹配模式的要求.这个功能有点类似搜索函数match,只是这是通过搜索模式来指定,而m ...

  8. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

  9. 第11.7节 Python正则表达式的字符串结尾匹配模式及元字符“$”功能介绍

    符号"$"表示匹配字符串的结尾,即字符串的结尾满足匹配模式的要求. 在 MULTILINE 模式(搜索标记中包含re.MULTILINE,关于搜索标记的含义请见<第11.2节 ...

随机推荐

  1. wireguard使用

    1.编译与安装 sudo apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-con ...

  2. 手写一个Web服务器,极简版Tomcat

    网络传输是通过遵守HTTP协议的数据格式来传输的. HTTP协议是由标准化组织W3C(World Wide Web Consortium,万维网联盟)和IETF(Internet Engineerin ...

  3. MOOC JAVA笔记

    MOOC JAVA笔记 1.基础了解 JDK是开发人员安装的,它提供了开发java程序的必须工具 JRE是普通用户安装的,它提供了java的运行环境 JVM是java虚拟机运行程序的核心 2.程序的移 ...

  4. 每天一个linux命令之top

    每天一个linux命令之top 转  https://www.linuxprobe.com/chapter-02.html 在图2-6中,top命令执行结果的前5行为系统整体的统计信息,其所代表的含义 ...

  5. JVM简单入门

    目录 初识JVM 双亲委派机制 沙箱安全机制 Native PC计数器 方法区 栈 堆 工具分析OOM GC算法 GC算法总结 JMM 初识JVM JVM的位置:jre中包含jvm. 双亲委派机制 双 ...

  6. 8、Spring Boot任务

    1.异步任务 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring ...

  7. 你了解ABBYY FineReader 14么?

    有没有一款是能够同时处理纸质文档和个类型PDF的一站式解决方案?答案是肯定的,ABBYY FineReader 14集合了强大的光学字符识别(OCR)以及 PDF 查看和编辑功能.不仅能够高效识别图片 ...

  8. 下载器Folx如何实现排队下载功能

    用户在下载多个文件时,当然会希望这些文件都能同时下载,以达到短时间内完成下载任务的目的.但另一方面来说,同时下载过多文件,会分散带宽资源,降低了每个文件的下载速度,从而导致下载时间的延长. 为了实现多 ...

  9. Java中的位掩码BitMask

    目录 JDK源码的使用 日常工作中的使用 JDK源码的使用 最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是 ...

  10. 人人都能学会系列之ThreadLocal

    1.概览 本文我们来看下java.lang包中的ThreadLocal,它赋予我们给每个线程存储自己数据的能力. 2.ThreadLocal API ThreadLocal允许我们存储的数据只能被特定 ...