新闻详情

新闻详情

首页 / 资讯中心 / 详情

python-字符串全解(六):正则表达式-量词

发布时间:2026/9/28 18:23:17来源:尧图网络
python-字符串全解(六):正则表达式-量词
本章讨论正则表达式的量词通过量词你可以匹配不同长度的重复字符类型从而解决非定长的字符串的匹配。4量词量词说白了就是如何表示重复这里的重复不只是单个字符的重复还包括不同字符的重复例如数字0-9任意一个字符的重复。同时还有贪婪和非贪婪的区别接下来我们来一一说明。4.1零次或者多次(*)通过*跟在一个字符或者字符类后面可以实现0次或者多次重复。我们看下下面的例子import re a a12bca1234bcabc a1 abcbcbc b re.findall(ra[0-9]*bc, a) c re.findall(ra[bc]*c, a1) d re.findall(ra[bc]*?c, a1) print(a {}, b {}, c {}, d {}. format(a, b, c, d)) # 输出结果a a12bca1234bcabc, b [a12bc, a1234bc, abc], # c [abcbcbc], d [abc]a通过在[0-9]的后面跟一个*表示这个0-9的任意数字出现0次或者多次所以符合条件的有三个子串第一个子串a12bc数字出现了两次第二个子串a1234bc数字出现了4次第三个是abc数字出现了0次因为*代表0次或者多次所以abc也符合条件。c通过[bc]*表示b或者c出现0次或者多次我们发现匹配到了整个字符串abcbcbc。但是其实abcabcbc这两个子串也符合条件但是为什么匹配的是最多的字符的呢这涉及到正则表达式的一个默认原则贪婪匹配就是尽量匹配更多的字符按照这个原则整个字符串都被匹配进来了。有时候我们不想匹配那么多只想匹配满足条件的最少字符的字符串那么这就用到了非贪婪匹配的语法。就是*后面加上一个这就告诉正则表达式尽量在满足条件的情况下少匹配字符。就像d这样我们只匹配了一个abc。4.1.1贪婪与非贪婪根据上面的代码我们引出了贪婪和非贪婪的概念。在正在表达式中如果应用了不确定次数的匹配比如*那么正则表达式会尽量匹配多的字符这就是贪婪匹配。如果你不想做贪婪匹配就需要在后面加上表示尽量少的匹配字符。除了*还有其他几个字符后面可以根表示非贪婪后面我们会一一谈到。因为第一个讲到的就是*所以我们就先引入贪婪和非贪婪的概念让你一开始就不带着疑问去看虽然排版上看上去比较凌乱但是不会让你带着疑问往下看这是值得的。后面遇到可以根非贪婪字符的情况我们都会讲到。4.2一次或者多次()这个和*唯一的区别就是表示至少出现一次而*可以出现0次。我们看下下面的代码import re a a12bca1234bcabc a1 abcbcbcac b re.findall(ra[0-9]bc, a) b1 re.findall(ra[0-9]*bc, a) c re.findall(ra[bc]c, a1) c1 re.findall(ra[bc]*c, a1) d re.findall(ra[bc]?c, a1) d1 re.findall(ra[bc]*?c, a1) print(a {}, b {}, b1{}, c {}, c1 {}, d {}, d1 {}. format(a, b, b1, c, c1, d, d1)) # 输出结果a a12bca1234bcabc, b [a12bc, a1234bc], # b1[a12bc, a1234bc, abc],c [abcbcbc], # c1 [abcbcbc, ac], d [abc], d1 [abc, ac]a1和之前代码不同的地方上我在后面又加了一个ac。b通过[0-9]表示从0到9至少出现一次所以满足条件的只有a12bc和a1234bc这两个子串。对比b1多了个abc因为*允许数字出现0次。c和d的结果一样因为也是默认贪婪都是尽量的多匹配字符。d和d1分别表示了*和的非贪婪匹配都是在后面加了号。因为*允许出现0次所以最后的ac也会被匹配。因为非贪婪所以和cc1的匹配结果完全不同。4.3 0次或1次(?)这个和上面我们讲的在*或者后跟的是不一样的。这个代表前面的字符只出现0次或者1次。当然它也有对应的非贪婪的写法就是后面跟也就是两个??。我们看一下代码aimport re a a2bca1234bcabc a1 abcbcbcacc b re.findall(ra[0-9]?bc, a) c re.findall(ra[bc]?c, a1) d re.findall(ra[bc]??c, a1) print(a {}, b {}, c {}, d {}. format(a, b, c, d)) # 输出结果a a2bca1234bcabc, b [a2bc, abc], # c [abc, acc], d [abc, ac]a可以看到正则表达式中[0-9]?表示在a和c之间出现0个或者一个数字满足条件的字符串子串有a2bc以及abc。c验证了的默认的贪婪模式我们可以看到匹配了acc子串d我们用了??来非贪婪匹配结果匹配了ac而不是acc。4.4 确定次数({n})上面我们学习了*和都是出现不确定的次数。假如我们需要出现准确的次数我们可以通过花括号中间填需要出现的次数来进行约束。例如我想字符a出现五次那么可以直接在a后面跟{5}。我们看下面的例子import re a a2bca1234bcabc a1 abcbcbcacc b re.findall(ra[0-9]{4}bc, a) c re.findall(rac{2}, a1) print(a {}, b {}, c {}. format(a, b, c)) # 输出结果a a2bca1234bcabc, b [a1234bc], c [acc]b中设定了数字出现4次所以只匹配到了a1234bcc中设定字符c出现两次所以匹配到了acc。这种经常用到明确知道固定字符数的场景就好比我们之前的电话号码r1[3-9]\d{9}。4.5从m到n次({m,n}){m,n}代表一个范围表示至少出现m次至多出现n次。对于不确定的次数所以我们很自然而然的想到贪婪和非贪婪。我想经过上面的学习大家很容易想出来非贪婪的写法就是在后面加?。我们看看下面的代码import re a a2bca1234bcabc a1 abcbcbcacc b re.findall(ra[0-9]{1,4}bc, a) c re.findall(ra.{0,9}c, a1) d re.findall(ra.{0,9}?c, a1) print(a {}, a1 {}, b {}, c {}, d {}. format(a, a1, b, c, d)) # 输出结果a a2bca1234bcabc, a1 abcbcbcacc, # b [a2bc, a1234bc], c [abcbcbcacc], # d [abc, ac]b中a和bc之间的数字需要出现至少1次最多4次所以匹配到了a2bc和a1234bc。c是贪婪式匹配所以匹配到了整个字符串。d因为花括号后面加了?所以进行非贪婪的匹配所以匹配到了两个子串。注意这次我们用了通配符逗号其实也可以用我们之前学到的\w来匹配单词字符至少对这个例子来讲效果是一样的。4.6 至少({m,})和最多{,n}这个和上面学到的从m次到n次是一样的只是一个限定了最少次数一个限定了最多次数。同样既然有不确定的次数所以必然会有贪婪和非贪婪的区别只要在后面加即可。我们看下面的代码import re a a2bca1234bcabc a1 abcbcbcacc b re.findall(ra[0-9]{1,}bc, a) c re.findall(ra.{,9}c, a1) d re.findall(ra.{,9}?c, a1) print(a {}, a1 {}, b {}, c {}, d {}. format(a, a1, b, c, d)) # 输出结果a a2bca1234bcabc, a1 abcbcbcacc, # b [a2bc, a1234bc], c [abcbcbcacc], # d [abc, ac]上面的代码只是稍微的做了修改和4.5的结果是一样的。我们将{1,4}改为{1,}将{0,9}改为{,9}注意这些数字逗号以及花括号之间不能有空格要不然会不是你想要的结果有兴趣的同学可以试一下。到这里我们量词就讲完了由于正则表达式太过于复杂所以我们每章的内容都不会太长。如果你读到这里我强烈建议你复习一下前面学到的章节以免遗忘。下一章我们讲位置断言到时候你会再次碰到我们熟悉的\b。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Jev模型:TypeSafe AI范式的工程实践指南 2026/9/28 19:20:22

Jev模型:TypeSafe AI范式的工程实践指南

1. 项目概述:Jev 模型不是“又一个大模型”,而是 TypeSafe AI 范式落地的第一块真实拼图最近刷屏的 Jev 模型,不是某家大厂突然甩出的又一个千亿参数黑盒,也不是靠堆算力、冲榜单博眼球的短期产物。它背后真正值得一线开发者驻足细…

阅读更多 →
OpenClaw 配 TaoToken:从玩具到超越 Linux 的开源奇迹,2026 爆火背后究竟是什么? 2026/9/28 19:20:22

OpenClaw 配 TaoToken:从玩具到超越 Linux 的开源奇迹,2026 爆火背后究竟是什么?

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

阅读更多 →
本地部署FastGPT接入在线大语言模型:config.json 配置与连通性验证 2026/9/28 19:20:22

本地部署FastGPT接入在线大语言模型:config.json 配置与连通性验证

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

阅读更多 →
汽车电子嵌入式开发与测试全解析:从ECU到UDS诊断 2026/9/28 19:20:09

汽车电子嵌入式开发与测试全解析:从ECU到UDS诊断

1. 汽车电子到底「大」在哪里做汽车电子开发这几年,最常被问的一句话是:“你们做的是不是修车?”每次都要解释半天——修车是修故障车,我们做的是在车还没造出来之前,让那些藏在车门、方向盘、发动机舱里的控制器&…

阅读更多 →
汽车电子知识体系全解析:从CAN总线到UDS诊断与Simulink建模 2026/9/28 19:20:09

汽车电子知识体系全解析:从CAN总线到UDS诊断与Simulink建模

很多人一聊汽车电子,第一反应就是“水太深”。从单片机到总线协议,从诊断规范到建模仿真,随便拎一个方向出来都够啃半年的。这篇文章我把汽车电子这个领域做个大盘点式的拆解,从嵌入式开发、总线通信、诊断协议、测试验证到Simuli…

阅读更多 →
月之暗面AI Agent开发岗一面面经:TaoToken统一Key接入Cline的settings.json配置骨架 2026/9/28 19:20:09

月之暗面AI Agent开发岗一面面经:TaoToken统一Key接入Cline的settings.json配置骨架

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉