python-字符串全解(六):正则表达式-分组
这一章我们讲分组分组在正则表达式中是一个很有用的工具。它主要有以下的作用重复缩小逻辑运算的范围内容提取反向引用通过命名读取内容等。如果你之前没有学习过分组这么一看这些作用说明肯定没法做到顾名思义甚至会觉得有点迷茫。放心就像我之前说过很多东西你只要一旦明白就会觉得非常的简单如果你读过我之前正则表达式的其他章节你肯定深有体会分组也一样接下来我们会详细的谈论分组。6.分组分组主要是用圆括号包裹起来的语法里面可以包含正则匹配的语法同时还有一些分组特有的语法。主要有捕获组可用于提取内容(...)非捕获组不提取内容(?:...)命名捕获组(?Pname...)引用命名组(?Pname)引用组通过序号例如/1/2。6.1重复以及内容提取((...))在前面讲的语法的时候我们提到了重复我们可以通过*?{m,n}这样的语法来重复前面的字符但是我们需要重复的字符不是一个而是多个呢这时候就需要用到分组双括号()比如(abc)这个代表abc可以重复一次或者多次从而可以匹配abcabcabc这样的字符串。如果在()中开始位置加入?:表示不提取内容。看一下下面的例子import re a abcabc23abcabc12ac1123abc31123abc b re.findall(r(abc)\d, a) b1 re.findall(r(?:abc)\d, a) c re.search(r(abc)\d, a) c1 re.search(r((abc)(\d)), a) print(a {}, b {}, b1 {}, c {}, c.group() {}, c.group(1) {} \ c1.group(0) {}, c1.group(1) {}, c1.group(2) {}, c1.group(3) {}. format(a, b, b1, c, c.group(), c.group(1), c1.group(0), c1.group(1), c1.group(2), c1.group(3))) # 输出结果a abcabc23abcabc12ac1123abc31123abc, # b [abc, abc, abc], b1 [abcabc23, abcabc12, abc31123], # c re.Match object; span(0, 8), matchabcabc23, # c.group() abcabc23, c.group(1) abc c1.group(0) abcabc23, # c1.group(1) abcabc23, c1.group(2) abc, c1.group(3) 23b中我们用圆括号包裹了abc然后在括号后面跟了一个表示abc至少重复一次后面跟了\d,表示数字至少出现一次。我们看b的结果有点奇怪怎么都是abc这是因为findall这个函数只是提取了括号里面的内容。对比一下b1结果就是比较符合预期。b1在原括号中开始位置加入了?:表示不提取括号内容。b1结果的第一个成员abcabc23其中abc至少出现了两次我们看b的结果中都是abc原因是()只提取重复的最后一次所以只有abc这个abc指的是abcabc23中的第二个abc。c我们用了一个全新的函数search这个函数在字符串中找到一个匹配就停止了。打印c发现c是一个Match对象这个对象最常用的函数就是group默认group()返回匹配整个正则的串其实和group(0)效果是一样的。这个正则表达式中有多少个分组()后面就可以跟最大数字是这个分组的个数。c1有三个分组那么group(1)代表第一个分组group(2)代表第二个分组group(3)代表第三个分组。分组是从左到右计算第一个左括号(算第一个第二个左括号(算第二个就算括号之间嵌套也没关系。c1的group(0)和group(1)结果是一样的原因是1把整个正则表达式都包含进来了所以结果也是匹配整个正则的值group(1)和group(2)分别是包含了字母和数字。6.2限制逻辑运算作用域逻辑运算我们还没有讲到我们用|表示或我们看一下下面的代码import re a abc2342adc1123abc31123abc b re.findall(rabc\d{1,9}|adc\d{1,9}|abc3abc\d{1,9},a) c re.findall(r(?:abc|adc|abc)\d{1,9}, a) print(a {}, b {}, c {}. format(a, b, c)) # 输出结果a abc2342adc1123abc31123abc, # b [abc2342, adc1123, abc31123], # c [abc2342, adc1123, abc31123]b是用我们之前的方式我们为了用逻辑或需要将每种可能就完整的写下来这样显得繁琐因为每个或的正则都有共通的\d{1,9}我们可以全部提取到外面这就需要用到分组圆括号这样这个或的逻辑运算只是被限制在圆括号内不会影响括号外的正则如c1所示。因为findall只捕获圆括号中的内容所以可以看到我们用?:来阻止捕获内容这样findall可以得到完整的结果。6.3命名捕获组((?Pname...))可以(?Pname...)这样的形式来给捕获组命名注意P是大些的P这样我们可以在group参数里面通过名字来引用这样做的好处是比没有意义的数字好记。看一下下面的代码import re a abcabc23abcabc12ac1123abc31123abc b re.search(r(?Pword(?Pletterabc)(?Pnumber\d)), a) print(b {}, b.group(1) {}, b.group(2) {}, b.group(3) {} \ b.group(word) {}, b.group(letter) {}, b.group(number) {}. format(b, b.group(1), b.group(2), b.group(3), b.group(word), b.group(letter), b.group(number))) # 输出结果b re.Match object; span(0, 8), matchabcabc23, # b.group(1) abcabc23, b.group(2) abc, b.group(3) 23 # b.group(word) abcabc23, b.group(letter) abc, b.group(number) 23b中我们将三个分组都做了命名最外层的分组命名为word这包含了剩下的两个分组。另外两个分组分别命名为letter和number。打印的结果来看group中输入名字和输入分组的位置都可以得到相同的结果只是命名之后更清晰明白增加了可读性。6.4分组引用((?Pname), \number, number是分组的位置)上一节我们讲了分组我们可以在正则表达式中引用这个分组可以通过命名引用?Pname)也可以通过分组位置引用用\加上分组位置。看一下下面的代码import re a abc12abcabc123abc b re.search(r(?Pletterabc)\d(?Pletter), a) b1 re.search(r(abc)\d\1, a) print(b {}, b.group() {}, b.group(1) {} \ b1.group() {}, b1.group(1) {}. format(b, b.group(), b.group(1), b1.group(), b1.group(1))) # 输出结果b re.Match object; span(0, 8), matchabc12abc, # b.group() abc12abc, b.group(1) abc # b1.group() abc12abc, b1.group(1) abcb首先命名了一个分组为letter这个分组包含了字母abc然后跟了\d表示至少有一个数字然后后引用了这个分组b1是用\1实现了同样的作用。我们可以看到结果是一样的。这里有一点要注意(?Pletter)这只是引用分组但是它本身并不是分组也就是说b的正则表达式中只有一个分组所以如果你b.group(2)会提示没有这个分组。如果你要把它当作一个分组需要再加一对圆括号如下面的代码所示import re a abc12abcabc123abc b re.search(r(?Pletterabc)\d((?Pletter)), a) b1 re.search(r(abc)\d(\1), a) print(b {}, b.group() {}, b.group(1) {}, b.group(2) {} \ b1.group() {}, b1.group(1) {}, b.group(2) {}. format(b, b.group(), b.group(1), b.group(2), b1.group(), b1.group(1), b1.group(2))) # 输出结果b re.Match object; span(0, 8), matchabc12abc, # b.group() abc12abc, b.group(1) abc, b.group(2) abc # b1.group() abc12abc, b1.group(1) abc, b.group(2) abcb和b1都多加了一个括号都有了两个分组这样就可以通过group(2)来获取分组的内容了。讲到这里我们的分组就讲完了。分组在重复多个字符还是很有用的另外分组还可以命名并且被引用这增加了程序的可读性下一章我们会介绍修饰符包含全局和分组修饰符。

相关新闻

深入理解 SAP ABAP CDS External Entities,从 ABAP SQL 到跨系统数据联邦

深入理解 SAP ABAP CDS External Entities,从 ABAP SQL 到跨系统数据联邦

在传统 ABAP 开发里,只要看到 SELECT,大多数人的第一反应都是从当前 AS ABAP 所连接的数据库读取数据。无论底层是 SAP HANA,还是早期系统里的其他数据库,ABAP SQL 面向的基本都是当前 ABAP System 自己的数据空间。 CDS External Entity 改变了这个边界。 它让一段看起来…

2026/10/13 9:51:00 阅读更多 →
Lost in Context: Addressing Context Anxiety in Large Language Models

Lost in Context: Addressing Context Anxiety in Large Language Models

《Lost in Context: Addressing Context Anxiety in Large Language Models》全文总结、创新点 + 指定章节中英对照翻译 一、论文整体核心内容总结 1. 核心概念:上下文焦虑(Context Anxiety) 本文首次系统性定义上下文焦虑:大模型明明具备完成任务的能力、且任务所需tok…

2026/10/13 9:49:58 阅读更多 →
DocCHA: Towards LLM-Augmented Interactive Online diagnosis System

DocCHA: Towards LLM-Augmented Interactive Online diagnosis System

主要内容 本文提出了一种名为DocCHA的基于大型语言模型(LLM)的增强型交互式在线诊断系统,旨在解决现有对话式健康代理(CHAs)静态、脆弱,缺乏自适应多轮推理、症状澄清和透明决策能力的问题,以提升其在临床诊断中的实际适用性。 DocCHA采用模块化、置信度感知的框架,将…

2026/10/13 9:49:58 阅读更多 →

最新新闻

VS Code中高效读取HDF5文件:从插件预览到h5py实战

VS Code中高效读取HDF5文件:从插件预览到h5py实战

你有没有遇到过这种场面:同事或者对接方丢给你一个.h5文件,说是训练好的模型权重,或者某次实验的全部原始数据,你兴冲冲地在 VS Code 里双击打开,结果满屏都是二进制乱码。这个画面我见过太多次了,包括我自…

2026/10/13 10:37:18 阅读更多 →
数组类型与底层原理:从静态到动态、从同构到异构的全解析

数组类型与底层原理:从静态到动态、从同构到异构的全解析

数组这名字,表面上看人人都懂,可真到写代码的时候,你会发现不同语言里的“数组”完全是几个物种。拿一个 int[10] 丢给 C 程序员,他脑子里是 10 个连续排列的整数;递给 Python 程序员,他大概率会反问一句…

2026/10/13 10:37:18 阅读更多 →
LeetCode链表题全攻略:从虚拟头结点到快慢指针的通用解法

LeetCode链表题全攻略:从虚拟头结点到快慢指针的通用解法

最近在整理自己的LeetCode刷题笔记,链表这一章给了我不少感触。很多人刚开始刷题时,把链表当成“送分题”,结果一到手写环节就翻车——不是空指针异常,就是链表被改成了环,甚至在一个反转操作上卡了半小时。链表确实是…

2026/10/13 10:37:18 阅读更多 →
端侧AI密度定律:硬件、模型与工程的三重优化

端侧AI密度定律:硬件、模型与工程的三重优化

1. 这不是概念炒作,是芯片、模型、场景三股力量在端侧突然“对齐”了“端侧智能规模化元年”这八个字,最近在技术会议、投资人briefing和芯片厂商白皮书里高频出现,但很多人听完只留下一个模糊印象:好像AI要下到手机、摄像头、家电…

2026/10/13 10:37:18 阅读更多 →
x86实操操作系统:从实模式到保护模式的真机启动内核

x86实操操作系统:从实模式到保护模式的真机启动内核

简介:本资源是经典操作系统实践教程《自己动手写操作系统》(于渊著)配套源码与开发环境的完整压缩包,面向计算机专业本科生、嵌入式开发者及系统编程爱好者,解决操作系统原理难理解、内核开发无从下手的核心痛点。压缩…

2026/10/13 10:37:18 阅读更多 →
企业采购智能体选型:为什么原生嵌入业务流程更适合核心采购场景?

企业采购智能体选型:为什么原生嵌入业务流程更适合核心采购场景?

随着大模型和Agent进入企业采购,采购智能体正在从简单的问答、文本生成,逐步进入供应商推荐、询价比价、价格分析、合同审查、订单处理、履约分析等真实业务场景。企业在进行采购智能体选型时,也开始面对不同的建设模式。 一种是通用桌面智能…

2026/10/13 10:36:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →