第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用

Python正则表达式工程实践:从回溯陷阱到可维护正则API 正则表达式是文本处理的底层基础设施,其本质是将模式编译为有限状态机进行匹配。理解Python re模块的编译机制、回溯原理与Unicode行为,是避免性能崩溃和逻辑错误的关键。命名捕获组、re.compile预编译、VERBOSE注释模式等技术,显著提升正则的可读性、可测试性与协作效率。在日志解析、配置文件操作、多语言清洗等真实场景中,合理运用环视断言、占有量词和标志控制(如DOTALL、MULTILINE),可构建稳定可靠的文本处理流水线。本文聚焦Python原生re模块的深度工程化用法,覆盖从调试定位到 阅读详情

一、 引言
在《第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.youkuaiyun.com/LaoYuanPython

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

现代数据科学家的正则工程实践:从清洗到压测 正则表达式是文本处理的基础技术,其核心在于模式匹配原理与确定性状态机建模;它支撑着数据清洗、日志解析、特征提取等关键环节,具备不可替代的工程价值。在电商评论清洗、金融FIX日志解析、SaaS前端埋点等真实场景中,正则直接决定数据质量与 pipeline 稳定性。本文聚焦Unicode安全、回溯控制、命名捕获、多行锚点与原子组五大能力,结合regex库与PyArrow等现代工具链,提供可验证、可维护、可压测的工业级正则实践方案。 阅读详情

相关推荐

Python正则表达式:命名组和反向引用

上述代码中,我们首先定义了一个正则表达式模式,该模式匹配以年、月、日格式表示的日期,并且要求月和日的值相同。在实际应用中,命名组和组的反向引用可以帮助我们更准确地匹配和处理文本中的模式。命名组功能允许我们为正则表达式中的某个子模式指定一个名称,从而可以在后续的操作中更方便地引用这个子模式。Python中的re模块提供了强大的正则表达式功能,其中命名组和反向引用是比较常用的扩展功能。组的反向引用是指用圆括号将正则表达式模式中的某个子模式括起来,并在后面的模式中通过\1、\2等语法来引用这个子模式。

与其临渊羡鱼,不如退而结网 367

java 正则表达式 分组(group)+设置分组名称

分组id是matcher帮我们自动按照分组顺序(1,2,3 …)分配好,在匹配的时候我们只需要输入分组id就能获取对应分组的值,但是分组名称需要我们自己提前设置好,和分组id一一对应组成一个map,先通过分组名称获取分组id再获取对应分组值。测试成功,不管是通过id还是名称都可以获取到对应的分组值。1.matcher类中通过分组id获取分组值。2.matcher类通过分组名称获取分组值。分组名称(key)-分组id(value)2.通过分组id获取。

weixin_43924444的博客 3395

汇编语言与接口技术(第4版)清华大学出版社 第2章 80*86微处理器 课后题答案

汇编语言与接口技术(第4版)清华大学出版社 第2章 80*86微处理器 课后题答案

m0_51658788的博客 3606

正则表达式分组命名

正则表达式分组命名

gongzairen的博客 654

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

【数据结构】面试题整理 共36题

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表中的元素在内存中不必是连续存储的,这使得链表在插入和删除操作时非常高效。单向链表(Singly Linked List):每个节点只包含一个指向下一个节点的指针。双向链表(Doubly Linked List):每个节点包含两个指针,一个指向下一个节点,一个指向前一个节点。循环链表(Circular Linked List):链表的最后一个节点指向第一个节点,形成一个环。

weixin_44329069的博客 7194

chatgpt赋能python:Python中的\1:正则表达式中的反向引用

反向引用是正则表达式中的一个非常常见的操作。当需要匹配某个字符串的时候,往往需要使用括号来将匹配的内容提取出来,而反向引用,就是使用\1这样的特殊字符,来引用先前已经匹配好的内容。^(\w +) ,在这个正则表达式中,^表示匹配开头,\w+表示匹配一个或多个字母、数字或下划线,而括号()则将匹配到的内容作为一个分组来对待。在这个正则表达式中,\s*表示匹配0个或多个空格,而\1则表示引用第一个分组,也就是之前匹配到的水果名称。只有第一个水果名称出现了两次的时候才匹配成功。

liangzijiaa的博客 1387

SAR型ADC的电荷重分配技术解析

本文深入解析了SAR型ADC的核心技术——电荷重分配。通过类比“猜数字”游戏,阐述了其逐次逼近的工作原理,并重点剖析了电容阵列如何实现高速、低功耗的模数转换。文章还探讨了该技术在速度、能效及集成度方面的优势,并指出了电容匹配精度等实际挑战,为嵌入式与物联网设备中的ADC选型与应用提供了实用指南。

nnn11的博客 906

python正则表达式反向引用

python中经常会用到正则表达式实现对一类数据的匹配,匹配时对感兴趣的部分用括号分组,方便后边反向引用.引用时用\1…\n分别代表对应的分组.当括号多的时候,添加或者删除一个匹配很麻烦. python中同样支持命名分组,使用方法如下:(?P<name>匹配模式),反向应用时用(?P=name) test_data = “abba” matchobj = re.search(r’(?P<test0>\w)(?P<test1>\w)(?P=test1)(?P=test0)’

weixin_39662684的博客 2392

AIGC游戏开发:如何评估生成内容的玩家满意度?

如何量化评估生成内容对玩家体验的影响?本文聚焦AIGC生成的游戏内容(包括但不限于剧情、关卡、NPC对话、道具),系统探讨玩家满意度的评估方法论,覆盖主观与客观评估、静态与动态内容、短期与长期体验等场景。核心概念:定义AIGC与玩家满意度的关联维度;评估方法:主观(问卷/访谈)与客观(行为/生理数据)评估的技术细节;数学模型:构建多指标融合的评估模型;实战案例:以AIGC生成关卡为例,演示从数据采集到模型落地的全流程;工具资源:推荐数据采集、分析与建模的工具链;

AI天才研究院 1224

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

第11.21节 Python 中正则表达式的其他扩展功能

一、 引言 在《第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用》中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中正则表达式的扩展功能非常多,所有扩展功能都是在左括号后面跟问号“?”来表示,具体扩展功能是要看问号后面的字符来确认,如“P”表示组名相关扩展。 下面老猿将未介绍的主要正则表达式扩展功能在本节进行介绍,下面介绍的扩...

老猿Python 976

uniapp - 微信支付报错 {“errMsg“:“requestPayment:fail:[payment微信:-1]General errors“} 详细解决办法,uniApp使用微信支付时报错

uniapp,微信支付报错,uniapp微信小程序 H5网页 安卓苹果ios真机调试时报错,uniapp真机测试微信支付报错如何解决,调用微信支付出现报错{"errMsg":"requestPayment:fail:[payment微信:-1]General errors"},微信支付提示错误,uniapp进行微信支付时报错怎么解决,如何解决微信支付报错,uniapp微信支付报错fail,uni-app真机测试ios上报错,uniapp真机测试安卓手机第一次支付成功第二次就报错了,uniapp微信支付调用第

✅ 精选推荐文章 4133

Python匹配对象的groups、groupdict和group之间的关系

匹配对象的groups()方法返回一个包含所有参与匹配的子组(不含组0)的匹配到的搜索文本子串的元组,groupdict返回一个包含所有匹配到的命名组的组名为键值和命名组匹配到的搜索文本子串为值作为元素的字典,group(组号…)则用于访问匹配到的组的搜索文本子串。三者都是用于访问匹配组的匹配文本,但返回内容格式不同,且groudict仅能访问命名组数据。 案例: >>> m=r...

老猿Python 3325

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 778

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

第十一章 Python 支撑正则表达式处理的re模块

re模块是Python中支持正则表达式处理的模块,老猿学了之后,发现这部分内容太多,要表述清楚需要开单章才能写清楚,但老猿觉得re模块的使用对多数人来说要通过教程学习去熟练掌握很难,需要经常接触练习加上速查手册才能解决问题。而最近老猿对新知识的学习感觉很迫切,好多要学的内容,所以最终决定不在这个模块过多投入,只写几个简单章节来导入,如果大家要学习详细知识,可以在网上找相关的教程。 本章目录: 老猿...

老猿Python 1633

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

一、 引言 在前面《第11.13节 Python正则表达式的转义符”\”功能介绍》介绍了正则表达式转义符’’,只不过当时作为转义符主要是用于在正则表达式中表示元字符自身的需要进行的转义。实际上,除了元字符使用转义符外,Python还支持由 ‘’ 和一个ASCII数字或ASCII字母字符组成的特殊序列,这些特殊代表特殊的含义。 如果’'后面跟的字符不是ASCII数字或者ASCII字母,那么正则样式将...

老猿Python 5160

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python正则表达式处理的组是什么?

在学习正则表达式处理开始阶段,对于匹配对象的group数据没有理解,查了资料进行验证测试,终于理解了。 组其实与组匹配模式相关,就是在匹配的正则表达式中使用小括号“()”括起来的任意一个合法的匹配模式串,左括号标记组的起点,右括号标记组的终点,即组匹配模式定义为: (组匹配模式串) 其中组匹配模式串是整个正则表达式的一个子匹配模式。在一个正则表达式内可以定义多个组,每个组都有一个顺序分配的序号(组...

老猿Python 1149

python正则表达式里转义字符_第11.15节 Python正则表达式转义符定义的特殊序列

一、引言在前面《第11.13节 Python正则表达式的转义符”\”功能介绍》介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自身的需要进行的转义。实际上,除了元字符使用转义符外,Python还支持由'\'和一个ASCII数字或ASCII字母字符组成的特殊序列,这些特殊代表特殊的含义。 如果'\'后面跟的字符不是ASCII数字或者ASCII字母,那么正则样式将直...

weixin_39810856的博客 340

Python语言学习(十三)

171、time.sleep()函数可以让程序暂停,括号内为秒数 172、正则表达式:用于描述复杂规则的工具。在re模块里面。有search()函数,搜索在字符串中正则表达式模式第一次出现的位置,格式为:re.search(r正则表达式,字符串),会返回一个范围,如果没找到会返回none。’.’表示除了换行符之外的所有字符,’\d’表示数字。可以用[]括起来表示一个字符类,只要符合里面的任一个字符...

君陌的博客 482

Claude 3.7 vs GPT-4o真实项目实战:LogSift日志告警工具开发复盘

日志监控是运维自动化与可观测性的基础能力,其核心在于实时解析、规则匹配、告警抑制与多通道通知。技术实现需兼顾轻量部署、低内存占用、高鲁棒性及配置可维护性,尤其在无root权限、资源受限的轻量云环境中,Python异步I/O、正则语义化匹配、systemd服务化封装等工程细节直接决定上线成败。本文基于LogSift这一真实落地的日志关键词实时告警工具,深度对比Claude 3.7与GPT-4o在需求拆解、异常处理、时间戳解析、告警抑制等关键环节的工程直觉差异,揭示大模型从‘能写代码’到‘懂生产约束’的能力跃迁

weixin_30480075的博客 312

正则表达式的命名分组

语法格式:(?<name>…) 命名分组也是捕获性分组,它将匹配的字符串捕获到一个组名称或编号名称中,在获得匹配结果后,可通过分组名进行获取。 如下是一个python的命名分组的例子: import re data = "#808080" regExp = r"#(?P<one>\d+)" replaceString = "\g<one>" + "~~" print re.sub(regExp,replaceString,data) # 808080~~ python

liaowenxiong的博客 2983

正则表达式--命名分组

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34409741的博客 4967

正则表达式(三)分组与引用

1.分组与编号 括号在正则中的功能就是用于分组, 被括号括起来的部分“子表达式”会被保存成一个子组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能。其实用括号括起来还有另外一个作用,那就是“复用”。 1.1 编号如何算 从左往右,第几个左括号就是第几个分组。 1.2 不保存子组 在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它,类似这种情况,在实际使用时,是没必要保存子组的。这时我们可以在

s31329的博客 1395

Python正则匹配re模块使用括号时的坑-(针对于反向引用)

Python正则匹配re模块使用括号时的坑-(针对于反向引用)

qq_34511096的博客 2269

正则之反向引用

1        概述 捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。要了解反向引用,首先要了解捕获组,关于捕获组,参考 正则基础之——捕获组(capture group)。 反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对出现等等。 对于普通捕获组和命名捕获组的引用,语法如下: 普通捕获组反向引

1405
上一篇: 第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式
下一篇: Python正则表达式处理的组是什么?
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值