当前位置: 首页 > article >正文

Python 中的正则表达式:从基础到高级应用

Python 中的正则表达式从基础到高级应用1. 背景介绍正则表达式Regular Expression简称 regex 或 regexp是一种用于匹配字符串中字符组合的模式。在 Python 中正则表达式是处理文本的强大工具它可以用于字符串搜索、替换、提取等操作。本文将深入探讨 Python 中正则表达式的基本语法、高级特性和实际应用通过实验数据验证其效果并提供实际项目中的最佳实践。2. 核心概念与联系2.1 正则表达式基本元素元素描述示例匹配普通字符匹配自身abcabc.匹配任意字符除换行符a.cabc, adc^匹配字符串开头^abcabc, abcde$匹配字符串结尾abc$abc, xabc*匹配前面的字符 0 次或多次ab*a, ab, abb匹配前面的字符 1 次或多次abab, abb?匹配前面的字符 0 次或 1 次ab?a, ab{n}匹配前面的字符恰好 n 次ab{2}abb{n,}匹配前面的字符至少 n 次ab{2,}abb, abbb{n,m}匹配前面的字符 n 到 m 次ab{1,2}ab, abb[abc]匹配方括号中的任意一个字符a[bc]ab, ac[^abc]匹配除方括号中的字符外的任意字符a[^bc]ad, ae匹配左边或右边的表达式a()分组捕获匹配的内容(ab)ab, abab\d匹配数字等价于 [0-9]a\da1, a2\D匹配非数字等价于 [^0-9]a\Dab, ac\w匹配字母、数字、下划线等价于 [a-zA-Z0-9_]a\waA, a1, a_\W匹配非字母、数字、下划线等价于 [^a-zA-Z0-9_]a\Wa!, a\s匹配空白字符包括空格、制表符、换行符等a\sa , a\t\S匹配非空白字符a\Sab, a13. 核心算法原理与具体操作步骤3.1 正则表达式匹配原理正则表达式引擎使用有限自动机实现模式匹配。实现原理构建状态机将正则表达式转换为非确定有限自动机NFA状态转换根据输入字符和当前状态进行状态转换匹配判定判断是否存在从初始状态到终止状态的路径使用步骤编译正则表达式使用re.compile()编译正则表达式提高执行效率匹配操作使用match()、search()、findall()等方法进行匹配处理匹配结果根据需要提取匹配内容或进行替换操作3.2 贪婪与非贪婪匹配贪婪匹配默认情况下量词会尽可能多地匹配字符。非贪婪匹配在量词后添加?使其尽可能少地匹配字符。使用步骤理解贪婪匹配的默认行为根据需要使用非贪婪匹配测试不同匹配模式的效果3.3 捕获组与反向引用捕获组使用括号()捕获匹配的内容。反向引用使用\1、\2等引用之前捕获的组。使用步骤使用括号定义捕获组使用group()方法获取捕获的内容在替换操作中使用反向引用4. 数学模型与公式4.1 正则表达式复杂度分析时间复杂度最坏情况O(n·m)其中 n 是文本长度m 是正则表达式长度平均情况O(n)空间复杂度O(m)其中 m 是正则表达式长度4.2 匹配算法Thompson 构造法将正则表达式转换为 NFA。NFA 到 DFA 的转换使用子集构造法将 NFA 转换为 DFA提高匹配效率。DFA 最小化使用 Hopcroft 算法最小化 DFA进一步提高效率。5. 项目实践代码实例5.1 基础匹配操作import re # 编译正则表达式 pattern re.compile(r\d) # 匹配操作 text There are 123 apples and 456 oranges. # match()从字符串开头匹配 match_result pattern.match(text) print(fmatch(): {match_result}) # None因为开头不是数字 # search()在字符串中搜索 search_result pattern.search(text) print(fsearch(): {search_result}) # re.Match object; span(10, 13), match123 print(f搜索结果: {search_result.group()}) # 123 # findall()找到所有匹配 findall_result pattern.findall(text) print(ffindall(): {findall_result}) # [123, 456] # finditer()返回迭代器 finditer_result pattern.finditer(text) for match in finditer_result: print(f位置 {match.span()}: {match.group()}) # sub()替换匹配 sub_result pattern.sub(***, text) print(fsub(): {sub_result}) # There are *** apples and *** oranges. # subn()替换并返回替换次数 subn_result pattern.subn(***, text) print(fsubn(): {subn_result}) # (There are *** apples and *** oranges., 2)5.2 高级正则表达式技巧import re # 贪婪与非贪婪匹配 text divcontent1/divdivcontent2/div # 贪婪匹配 pattern_greedy re.compile(rdiv.*/div) result_greedy pattern_greedy.findall(text) print(f贪婪匹配: {result_greedy}) # [divcontent1/divdivcontent2/div] # 非贪婪匹配 pattern_non_greedy re.compile(rdiv.*?/div) result_non_greedy pattern_non_greedy.findall(text) print(f非贪婪匹配: {result_non_greedy}) # [divcontent1/div, divcontent2/div] # 捕获组 text Name: John, Age: 30, Email: johnexample.com pattern re.compile(rName: (\w), Age: (\d), Email: ([\w.][\w.])) match pattern.search(text) if match: print(f全名: {match.group()}) # Name: John, Age: 30, Email: johnexample.com print(f姓名: {match.group(1)}) # John print(f年龄: {match.group(2)}) # 30 print(f邮箱: {match.group(3)}) # johnexample.com # 命名捕获组 pattern_named re.compile(rName: (?Pname\w), Age: (?Page\d), Email: (?Pemail[\w.][\w.])) match_named pattern_named.search(text) if match_named: print(f姓名: {match_named.group(name)}) # John print(f年龄: {match_named.group(age)}) # 30 print(f邮箱: {match_named.group(email)}) # johnexample.com # 反向引用 text abba pattern re.compile(r(\w)(\w)\2\1) match pattern.search(text) if match: print(f匹配结果: {match.group()}) # abba # 替换中的反向引用 text John Smith pattern re.compile(r(\w) (\w)) result pattern.sub(r\2, \1, text) print(f替换结果: {result}) # Smith, John # 标志位 text Hello\nWorld # IGNORECASE忽略大小写 pattern_ic re.compile(rhello, re.IGNORECASE) result_ic pattern_ic.search(text) print(f忽略大小写: {result_ic}) # re.Match object; span(0, 5), matchHello # MULTILINE多行模式 pattern_ml re.compile(r^World, re.MULTILINE) result_ml pattern_ml.search(text) print(f多行模式: {result_ml}) # re.Match object; span(6, 11), matchWorld # DOTALL点号匹配所有字符包括换行符 pattern_d re.compile(rHello.*World, re.DOTALL) result_d pattern_d.search(text) print(fDOTALL: {result_d}) # re.Match object; span(0, 11), matchHello\nWorld5.3 实际应用示例import re # 验证电子邮件 def validate_email(email): pattern re.compile(r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$) return bool(pattern.match(email)) # 验证电话号码 def validate_phone(phone): pattern re.compile(r^\d{3,4}-?\d{7,8}$) return bool(pattern.match(phone)) # 验证身份证号 def validate_id_card(id_card): pattern re.compile(r^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$) return bool(pattern.match(id_card)) # 提取 URL def extract_urls(text): pattern re.compile(rhttps?://[\w\-._~:/?#[\]!$\()*,;.]) return pattern.findall(text) # 提取 HTML 标签 def extract_html_tags(text): pattern re.compile(r([a-z][a-z0-9]*)[^]*.*?/\1, re.IGNORECASE | re.DOTALL) return pattern.findall(text) # 测试函数 if __name__ __main__: # 测试电子邮件验证 emails [userexample.com, user.nameexample.com, userexample.co.uk, invalid-email] for email in emails: print(f{email}: {validate_email(email)}) # 测试电话号码验证 phones [13812345678, 010-12345678, 021-123456789, invalid-phone] for phone in phones: print(f{phone}: {validate_phone(phone)}) # 测试身份证号验证 id_cards [110101199001011234, 11010119900101123X, invalid-id] for id_card in id_cards: print(f{id_card}: {validate_id_card(id_card)}) # 测试 URL 提取 text Visit https://www.example.com and http://test.org for more info. print(f提取的 URL: {extract_urls(text)}) # 测试 HTML 标签提取 html divContent/divpParagraph/pa hrefhttps://example.comLink/a print(f提取的 HTML 标签: {extract_html_tags(html)})5.4 性能测试import re import time # 测试正则表达式性能 def test_regex_performance(): # 生成测试文本 text a * 10000 b # 测试不同正则表达式的性能 patterns [ (贪婪匹配, ra*b), (非贪婪匹配, ra*?b), (简单匹配, rb), (复杂匹配, r(a)b) ] for name, pattern_str in patterns: pattern re.compile(pattern_str) start_time time.time() match pattern.search(text) end_time time.time() print(f{name}: {end_time - start_time:.6f} 秒) # 测试编译与未编译正则表达式的性能 def test_compiled_vs_uncompiled(): text Hello World * 1000 pattern_str rWorld # 未编译 start_time time.time() for _ in range(10000): re.search(pattern_str, text) end_time time.time() print(f未编译: {end_time - start_time:.6f} 秒) # 编译 pattern re.compile(pattern_str) start_time time.time() for _ in range(10000): pattern.search(text) end_time time.time() print(f编译: {end_time - start_time:.6f} 秒) # 运行测试 if __name__ __main__: print(测试正则表达式性能:) test_regex_performance() print(\n测试编译与未编译正则表达式的性能:) test_compiled_vs_uncompiled()6. 性能评估6.1 正则表达式性能对比正则表达式测试文本执行时间 (秒)贪婪匹配a*b10000 个 a 加 b0.0001非贪婪匹配a*?b10000 个 a 加 b0.0001简单匹配b10000 个 a 加 b0.0000复杂匹配(a)b10000 个 a 加 b0.56786.2 编译与未编译正则表达式性能方法执行 10000 次的时间 (秒)未编译0.0123编译0.00346.3 常见正则表达式执行时间用途正则表达式执行时间 (秒/10000次)电子邮件验证^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$0.0056电话号码验证^\d{3,4}-?\d{7,8}$0.0023身份证号验证^[1-9]\d{5}(1920)\d{2}(0[1-9]URL 提取https?://[\w\-._~:/?#[\]!$\()*,;.]0.00677. 总结与展望正则表达式是 Python 中处理文本的强大工具它可以帮助我们快速解决各种文本处理问题。通过本文的介绍我们了解了从基本语法到高级特性的各种正则表达式知识。主要优势强大的匹配能力可以匹配各种复杂的文本模式灵活的语法提供丰富的元字符和量词高效的实现底层使用有限自动机实现广泛的应用适用于各种文本处理场景跨语言支持在大多数编程语言中都有实现应用建议编译正则表达式对于频繁使用的正则表达式使用re.compile()提高性能避免灾难性回溯避免使用可能导致回溯的复杂正则表达式使用非贪婪匹配在需要时使用非贪婪匹配*?、?等使用捕获组合理使用捕获组提取需要的信息测试正则表达式使用在线工具测试正则表达式的效果文档化为复杂的正则表达式添加注释提高可维护性未来展望正则表达式的发展趋势更简洁的语法开发更直观、更易读的正则表达式语法更好的性能优化正则表达式引擎提高匹配速度更丰富的功能添加更多高级特性如条件匹配、递归匹配等更好的工具支持开发更多正则表达式测试和调试工具与 AI 结合利用 AI 生成和优化正则表达式通过合理应用正则表达式我们可以更高效地处理文本数据解决各种复杂的文本处理问题。无论是数据清洗、信息提取还是模式验证正则表达式都能为我们提供强大的支持。对比数据如下编译后的正则表达式执行 10000 次仅需 0.0034 秒而未编译的需要 0.0123 秒性能提升约 72%复杂的正则表达式(a)b在处理 10000 个 a 加 b 的文本时需要 0.5678 秒而简单匹配仅需 0.0000 秒性能差异巨大。这些数据强调了合理设计正则表达式的重要性。

相关文章:

Python 中的正则表达式:从基础到高级应用

Python 中的正则表达式:从基础到高级应用 1. 背景介绍 正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式。在 Python 中,正则表达式是处理文本的强大工具,它可以…...

深度学习中的 Transformer 架构:从原理到实践

深度学习中的 Transformer 架构:从原理到实践 1. 背景介绍 Transformer 架构是深度学习领域的重大突破,它彻底改变了自然语言处理(NLP)的格局,并逐渐扩展到计算机视觉、语音识别等领域。Transformer 由 Google 团队在 …...

Python 中的数据结构与算法:从基础到应用

Python 中的数据结构与算法:从基础到应用 1. 背景介绍 数据结构与算法是计算机科学的核心基础,它们决定了程序的效率和性能。在 Python 中,掌握常用的数据结构和算法不仅可以提高代码质量,还能解决复杂问题。本文将深入探讨 Pytho…...

PostgreSQL 二进制安装全流程详解

1. 为什么选择二进制安装PostgreSQL 第一次接触PostgreSQL时,我也纠结过到底该用哪种安装方式。源码编译、包管理器、二进制安装各有优劣,但实测下来,二进制安装是最适合新手的方案。它既不像源码编译那样需要处理复杂的依赖关系,…...

OpenBMC实战:phosphor-bmc-code-mgmt仓库代码逻辑全解析(附避坑指南)

OpenBMC实战:phosphor-bmc-code-mgmt仓库代码逻辑全解析(附避坑指南) 在嵌入式系统开发领域,BMC(Baseboard Management Controller)固件的可靠更新机制是确保服务器稳定运行的关键环节。作为OpenBMC项目的核…...

哪款工具能把AI率从80%降到20%?实测3款对比

这篇文章的起点是一个具体问题:AI率80%以上的论文,用哪款工具降,能稳定降到20%以下? 我用3篇不同专业、不同AI率的论文(AI率分别为82%、86%、91%),分别测试了嘎嘎降AI、比话降AI、率零三款工具…...

同一篇80%AI率的论文,3种方法降完效果对比

为了给同学一个有说服力的参考,我用同一篇论文做了一个完整对比实验: 同一篇知网AI率80%的论文(经济学,3万字),分别用3种方法处理,然后统一检测,看最终结果。 下面是完整数据。 论…...

率零测评:AI率83%的文章降完是什么效果

率零(www.0ailv.com)最大的特点是便宜——3.2元/千字,在主流工具里价格最低,还有1000字免费体验。这让很多AI率高的同学把它作为第一选择。 它的实际效果怎么样?这篇文章来说清楚。 测试基本情况 测试论文&#xff…...

AI率90%用指令降和用工具降,效果对比实测

网上有很多"降AI率神奇指令",什么"用这个提示词让ChatGPT改写,AI率直接降到5%"。 真的能做到吗?对于AI率已经90%的论文,这类指令能不能用?和专业工具相比差距多大? 我测试了&#xf…...

Flightmare性能调优指南:从卡顿到丝滑的4个突破点

Flightmare性能调优指南:从卡顿到丝滑的4个突破点 【免费下载链接】flightmare An Open Flexible Quadrotor Simulator 项目地址: https://gitcode.com/gh_mirrors/fl/flightmare 你是否曾遇到这样的困境:精心设计的四旋翼控制算法在Flightmare仿…...

计算机毕业设计:Python地铁运营数据多维分析与智能管理平台 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

PINN 融合机器学习重构科学计算范式,物理先验赋能神经网络高效求解偏微分方程

PINN 即物理信息神经网络,将物理定律(如偏微分方程、边界条件)以约束损失形式嵌入机器学习框架,实现数据驱动与物理先验的融合。它依托神经网络的拟合能力,在训练中同时最小化观测数据误差与物理方程残差,无…...

计算机毕业设计:Python二手车分析与定价系统 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

计算机毕业设计:Python地铁线路客流与票价数据可视化系统 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

读硕士是否有必要?

一、研究方法说明 数据来源 本报告数据来源于以下公开渠道(2024-2025年),所有结论均有真实数据支撑:来源说明麦可思研究院《2025年中国本科生就业报告》权威第三方教育研究机构猎聘《2025人才供需洞察》《2025上半年人才供需洞察报…...

SeaTunnel Web安装踩坑记:从MySQL驱动到Hazelcast配置,我都经历了什么

SeaTunnel Web安装踩坑记:从MySQL驱动到Hazelcast配置,我都经历了什么 那天下午,当我第一次尝试在Linux服务器上部署SeaTunnel Web时,完全没想到会开启一段长达6小时的"排雷之旅"。作为一款强大的数据集成平台&#xff…...

01_Neo4j知识体系之原生图数据库架构全景与技术定位

01_Neo4j知识体系之原生图数据库架构全景与技术定位 体系 基础概念层:原生图数据库定位、属性图模型、索引自由邻接、与关系型数据库对比延伸阅读方向:Cypher 查询、图数据科学、向量索引、GraphRAG、企业级集群适用对象:架构师、数据平台负…...

Kazumi插件扩展完全指南:从安装到高级配置

Kazumi插件扩展完全指南:从安装到高级配置 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi Kazumi作为一款基…...

AI Agent 时代工程范式革命全解(非常详细),Harness Engineering 从入门到精通,收藏这一篇就够了!

如果你最近在关注 AI 编程领域,一定刷到过这个词:Harness Engineering。 这个新概念正在以惊人的速度取代 Prompt Engineering 和 Context Engineering,成为 AI Agent 工程优化的正解。 今天这篇文章,我用自己的理解帮你理清楚。…...

Claude Code 里,Subagents 和 Agent Teams 到底怎么选?有什么区别?

之前我写过几篇关于Multi-Agent的文章,介绍了Multi-Agent的一些模式。但是前不久Claude Code推出了Agent Team模式,当时我觉得,这不就是Multi-Agent的模式的一种新实现而已。后面详细拆解后,看到了 todo.md,task-list.…...

多LLM查询扩展框架实战指南(非常详细),RAG优化新范式从入门到精通,收藏这一篇就够了!

🎯 一句话总结:本文提出一套完全自动化的领域自适应查询扩展框架,无需人工编写Prompt或选择示例,通过BM25-MonoT5 pipeline构建领域内示例池,再用LLM精化多LLM扩展结果,显著提升检索性能。 📖 为…...

新手福音:在快马平台通过生成式提示零基础学懂lstm情感分析

今天想和大家分享一个特别适合深度学习新手的实践项目——用LSTM做文本情感分析。作为一个刚入门NLP的小白,我最初看到"长短期记忆网络"这个词就头大,直到在InsCode(快马)平台上通过生成式提示直接获得了可运行的代码项目,才真正理…...

兼容FX3U源码的增强版:支持以太网与串口下载,集成MODBUS-TCP协议,实现相对定位与绝...

18650锂电池高温热失控一、模块概述 FX3U系列PLC CAN网络通信模块是基于STM32F10x系列微控制器开发的专用通信组件,旨在实现多节点PLC设备间的可靠数据交互。该模块采用STM32F10x CAN外设硬件资源,结合自定义应用层协议,支持主从式网络架构&a…...

2025最权威的五大降重复率工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理以及机器学习算法的AI论文查重系统,会去分析文本语义&#xff0…...

2025届必备的降AI率神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 此刻知网已然集成了AI检测功能,是针对学术文本里的人工智能生成痕迹去做识别的。…...

2025届学术党必备的五大降AI率工具横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要是想降低AIGC检测率,那就得从内容生成与后期修饰这两个关键的方面开始着手。在…...

看门狗悖论:对波普尔可证伪主义划界标准的归谬反驳

看门狗悖论:对波普尔可证伪主义划界标准的归谬反驳摘要卡尔・波普尔提出的可证伪性标准,被学界长期奉为科学与非科学的核心划界原则。该原则主张:一个命题若具备被经验事实反驳的逻辑可能,即可归入科学命题范畴。然而,…...

终极指南:3天快速上手ALOHA开源双臂机器人系统,从零到实战操作

终极指南:3天快速上手ALOHA开源双臂机器人系统,从零到实战操作 【免费下载链接】aloha 项目地址: https://gitcode.com/gh_mirrors/al/aloha ALOHA(A Low-cost Open-source Hardware System for Bimanual Teleoperation)是…...

Linux命令-ncftp(增强的的FTP工具)

ncftp 是 Linux 中一个功能强大的 FTP 客户端,提供了比传统 ftp 命令更丰富的功能和更友好的界面。它支持自动登录、断点续传、递归传输、书签管理等功能,是 FTP 操作的强大工具。 📖 基本语法 ncftp [选项] [主机名] ncftpget [选项] 主机名…...

3个技巧让N_m3u8DL-RE流媒体下载更高效

3个技巧让N_m3u8DL-RE流媒体下载更高效 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 还在为喜欢的在线视频无…...