20个Python 正则表达式应用与技巧
本文分享自华为云社区《Python 正则表达式大揭秘应用与技巧全解析》,作者:柠檬味拥抱。
Python 中的 re 模块是用于处理正则表达式的强大工具。正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式。在本文中,我们将探讨 Python 中 re 模块的应用和一些技巧,帮助您更好地理解和利用正则表达式。
1. 导入 re 模块
在开始之前,首先要确保已经导入了 re 模块:
import re
2. 使用 re 模块进行匹配
以下是一个简单的示例,演示如何使用 re 模块在字符串中查找特定模式的匹配项:
text = "The quick brown fox jumps over the lazy dog" # 使用 re 模块查找匹配项 matches = re.findall(r'\b\w{3}\b', text) print(matches) # 输出匹配的单词列表
在上面的示例中,我们使用了 \b\w{3}\b
这个正则表达式来匹配长度为3的单词。\b
表示单词的边界,\w{3}
表示匹配三个字母字符。re.findall()
函数返回所有匹配的结果。
3. 使用分组
分组是正则表达式中的一个强大功能,它允许您对匹配的部分进行分组处理。以下是一个示例,演示如何使用分组从文本中提取出邮件地址:
text = "Contact us at: support@example.com, sales@example.com" # 使用分组提取邮件地址 emails = re.findall(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', text) print(emails) # 输出提取的邮件地址列表
在上面的示例中,([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})
是一个匹配邮件地址的正则表达式。其中,()
将整个邮件地址作为一个分组,使得 re.findall()
函数只返回匹配的邮件地址部分。
4. 替换文本中的字符串
re 模块还提供了替换功能,允许您使用正则表达式来替换文本中的特定字符串。以下是一个示例,演示如何将文本中的所有数字替换为 “X”:
text = "There are 123 apples and 456 oranges" # 使用 re.sub() 函数替换文本中的数字为 "X" new_text = re.sub(r'\d+', 'X', text) print(new_text) # 输出替换后的文本
在上面的示例中,re.sub(r'\d+', 'X', text)
使用正则表达式 \d+
匹配一个或多个数字,并将其替换为 “X”。
5. 使用编译的正则表达式
在处理大量文本时,编译正则表达式可以提高匹配效率。以下是一个示例,演示如何使用编译后的正则表达式进行匹配:
pattern = re.compile(r'\bpython\b', re.IGNORECASE) text = "Python is a popular programming language" # 使用编译后的正则表达式进行匹配 match = pattern.search(text) if match: print("Found") else: print("Not found")
在上面的示例中,re.compile()
函数编译了一个不区分大小写的正则表达式,并且使用 search()
方法进行匹配。
通过掌握以上技巧,您可以更加灵活和高效地使用 Python 中的 re 模块进行正则表达式的处理。正则表达式是一项强大的技能,在处理文本和字符串时非常有用。
6. 使用预定义字符类
正则表达式中有一些预定义的字符类,可以简化匹配特定类型字符的操作。以下是一些常用的预定义字符类及其示例用法:
\d
:匹配任意数字字符。\w
:匹配任意字母、数字或下划线字符。\s
:匹配任意空白字符(空格、制表符、换行符等)。
text = "The code is 1234 and the password is abcd_123" # 使用预定义字符类匹配数字和字母密码 codes = re.findall(r'\b\w+\b', text) print(codes) # 输出匹配的代码和密码列表
7. 使用量词
量词用于指定匹配字符或组的数量。以下是一些常用的量词及其示例用法:
*
:匹配前一个字符零次或多次。+
:匹配前一个字符一次或多次。?
:匹配前一个字符零次或一次。{n}
:匹配前一个字符恰好 n 次。{n,}
:匹配前一个字符至少 n 次。{n,m}
:匹配前一个字符至少 n 次,但不超过 m 次。
text = "The Python programming language is widely used for data analysis" # 使用量词匹配至少包含两个字母的单词 words = re.findall(r'\b\w{2,}\b', text) print(words) # 输出匹配的单词列表
8. 使用锚点
锚点用于匹配字符串的边界,而不是实际的字符。以下是一些常用的锚点及其示例用法:
^
:匹配字符串的开头。$
:匹配字符串的结尾。\b
:匹配单词的边界。
text = "Python is a great language for both beginners and experts" # 使用锚点匹配以 Python 开头的句子 sentence = re.findall(r'^Python.*', text) print(sentence) # 输出匹配的句子
9. 贪婪与非贪婪匹配
在正则表达式中,量词默认是贪婪的,即它们会尽可能匹配最长的字符串。但有时候我们希望匹配最短的字符串,这时候就需要使用非贪婪匹配。在量词后面加上 ?
符号可以将其变为非贪婪匹配。
text = "Python is a powerful programming language" # 使用贪婪匹配查找 "p" 到 "g" 之间的内容 greedy_match = re.findall(r'p.*g', text) # 使用非贪婪匹配查找 "p" 到 "g" 之间的内容 non_greedy_match = re.findall(r'p.*?g', text) print("贪婪匹配:", greedy_match) # 输出贪婪匹配结果 print("非贪婪匹配:", non_greedy_match) # 输出非贪婪匹配结果
10. 使用后向引用
后向引用允许您在正则表达式中引用先前匹配的内容。这在需要匹配重复的模式时非常有用。
text = "apple apple orange orange" # 使用后向引用匹配重复的单词 duplicates = re.findall(r'(\b\w+\b) \1', text) print("重复的单词:", duplicates) # 输出匹配到的重复单词列表
11. 多行匹配
有时候我们需要匹配多行文本,而不仅仅是单行。这时可以使用 re.MULTILINE
标志来启用多行匹配模式。
text = """Python is a popular programming language. It is used for web development, data analysis, and more. Python has a simple syntax and is easy to learn.""" # 使用多行匹配模式匹配以大写字母开头的句子 sentences = re.findall(r'^[A-Z].*$', text, re.MULTILINE) print("以大写字母开头的句子:", sentences) # 输出匹配到的句子列表
12. 使用命名分组
在复杂的正则表达式中,为了增加可读性和维护性,可以使用命名分组来标识匹配的部分。
text = "John has 5 apples, Mary has 3 oranges" # 使用命名分组提取人名和水果数量 matches = re.findall(r'(?P<name>\w+) has (?P<quantity>\d+) \w+', text) for match in matches: print("Name:", match['name'], "- Quantity:", match['quantity'])
以上是一些高级技巧,可以进一步扩展您对正则表达式的应用和理解。通过不断练习和尝试,您将能够更灵活地应用正则表达式来解决各种文本处理问题。
13. 使用预搜索断言
预搜索断言允许您在匹配字符串时,指定字符串之前或之后的条件。它不会消耗匹配的字符,仅用于指定条件。
text = "apple banana orange grape" # 使用预搜索断言匹配出包含 "apple" 之后的所有水果 result = re.findall(r'(?<=apple\s)(\w+)', text) print("包含 'apple' 之后的水果:", result) # 输出匹配到的水果列表
14. 使用肯定与否定预搜索断言
肯定预搜索断言 (?=...)
匹配满足条件的字符串,而否定预搜索断言 (?!)
匹配不满足条件的字符串。
text = "Python is a powerful programming language" # 使用肯定预搜索断言匹配包含 "is" 的单词 positive_result = re.findall(r'\b\w+(?= is\b)', text) # 使用否定预搜索断言匹配不包含 "is" 的单词 negative_result = re.findall(r'\b\w+(?! is\b)', text) print("肯定预搜索断言:", positive_result) # 输出匹配到的单词列表 print("否定预搜索断言:", negative_result) # 输出匹配到的单词列表
15. 使用 re.finditer() 函数
re.finditer()
函数与 re.findall()
函数类似,但它返回一个迭代器,可以逐个访问匹配对象。
text = "Python is a powerful programming language" # 使用 re.finditer() 函数匹配所有单词 matches_iter = re.finditer(r'\b\w+\b', text) for match in matches_iter: print(match.group()) # 输出匹配到的单词
16. 使用 re.split() 函数
除了匹配和查找文本模式,re
模块还提供了 re.split()
函数,用于根据正则表达式模式拆分字符串。
text = "apple,banana,orange,grape" # 使用 re.split() 函数根据逗号拆分字符串 fruits = re.split(r',', text) print("拆分后的水果列表:", fruits) # 输出拆分后的水果列表
17. 使用 re.sub() 函数的替换函数参数
re.sub()
函数的第二个参数可以是一个函数,用于处理匹配的结果后再替换。
def double(match): return str(int(match.group(0)) * 2) text = "The numbers are 1, 2, 3, and 4" # 使用替换函数参数将所有数字乘以2 new_text = re.sub(r'\d+', double, text) print("替换后的文本:", new_text) # 输出替换后的文本
18. 使用 re.fullmatch() 函数
re.fullmatch()
函数用于检查整个字符串是否完全匹配给定的模式。
pattern = re.compile(r'\d{4}-\d{2}-\d{2}') date1 = "2022-01-15" date2 = "15-01-2022" # 使用 re.fullmatch() 函数检查日期格式 match1 = pattern.fullmatch(date1) match2 = pattern.fullmatch(date2) if match1: print("日期格式正确") else: print("日期格式错误") if match2: print("日期格式正确") else: print("日期格式错误")
19. 使用 re.IGNORECASE 标志进行不区分大小写匹配
在编译正则表达式时,可以使用 re.IGNORECASE
标志来进行不区分大小写的匹配。
pattern = re.compile(r'python', re.IGNORECASE) text = "Python is a powerful programming language" # 使用不区分大小写匹配模式查找 "Python" match = pattern.search(text) if match: print("Found") else: print("Not found")
20. 使用 re.DEBUG 标志进行正则表达式调试
在编译正则表达式时,可以使用 re.DEBUG
标志来输出正则表达式的调试信息,以便更好地理解它的工作原理。
pattern = re.compile(r'\b\w{3}\b', re.DEBUG) text = "The quick brown fox jumps over the lazy dog" # 输出编译后的正则表达式调试信息 pattern.findall(text)
通过继续学习和实践这些高级的正则表达式技巧,您将能够更好地应用正则表达式来处理各种文本匹配和处理任务,提高代码的效率和可维护性。正则表达式是 Python 中强大而灵活的工具之一,对于处理字符串模式非常有用。
总结
通过本文的介绍,我们探索了 Python 中 re 模块的应用与技巧,使您能够更灵活和高效地处理正则表达式。我们从基础的模式匹配开始,介绍了如何使用 re 模块进行匹配、分组、替换等操作。随后,我们深入探讨了一些高级技巧,包括贪婪与非贪婪匹配、后向引用、多行匹配、预搜索断言等,这些技巧可以帮助您更好地处理复杂的文本处理任务。此外,我们还介绍了一些实用的函数和标志,如 re.split()
、re.sub()
的替换函数参数、re.fullmatch()
、re.IGNORECASE
、re.DEBUG
等,使您能够更灵活地应用正则表达式解决实际问题。
掌握正则表达式是 Python 编程中非常重要的一部分,它能够帮助我们更快地处理字符串模式匹配、文本提取等任务,提高代码的效率和可维护性。通过不断学习和实践,您将能够更深入地理解和应用正则表达式,解决各种文本处理问题,提升自己在 Python 编程中的技能水平。希望本文对您有所帮助,欢迎继续探索和学习更多关于正则表达式的知识。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每周开源观察 | Mistral 8x22B大模型;PHP排名跌至历史最低;微软“白嫖”开源?deepin-IDE实现自举
OSCHINA 带你回顾一周(4.8-4.14)开源新闻、开源项目、重磅事件,以及技术分享等值得开发者关注的内容。 OpenSource Weekly 软件更新 FFmpeg 7.0“Dijkstra”发布 Ubuntu 24.04 LTS 开启 Beta 测试 JavaScript 引擎 V8 的内存沙盒 (V8 Sandbox) 开始测试 Redict 首个稳定版 7.3.0 发布,基于 Redis 7.2.4 的社区分支 微信基于 SQLite 的开源终端数据库 WCDB 迎来重大升级 zx 8.0.0 正式发布,谷歌开源的脚本工具 首个 Android 15 Beta 版本发布 Oracle 发布 DTrace 2.0.0-1.14 ESLint v9.0.0 正式发布 Visual Studio Code 1.88 发布 JetBrains 全家桶 2024 首个大版本更新 (2024.1) 综合资讯 Zabbix 7.0 变更开源协议,从 GPLv2 转为 AGPLv3 通义千问开源 320 亿参数模型 Mistral AI 开源 Mistral 8x22B Moe 大模型...
- 下一篇
基于香橙派AIpro将开源框架模型转换为昇腾模型
本文分享自华为云社区《如何基于香橙派AIpro将开源框架模型转换为昇腾模型》,作者:昇腾CANN。 在前面的介绍中,我们知道了如何基于香橙派AIpro开发AI推理应用,也大致了解到在推理之前,需要把原始网络模型 (可能是 PyTorch 的、TensorFlow,可能是Caffe的等等) 转换成 .om 模型,然后才能调用昇腾的aclmdlExecute 等模型执行接口在香橙派AIpro进行模型推理。这个模型转换的过程就要用到 ATC 工具,目前 ATC 工具直接支持从 Caffe、ONNX、TensorFlow 以及 MindSpore模型的转换,所以如果你的训练框架是 PyTorch,则需要做 torch.onnx.export 操作导出成ONNX模型后才能使用ATC工具。 01 ATC工具简介 昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是昇腾模型转换工具,它可以将开源框架的网络模型(例如TensorFlow、ONNX等)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续的模型推理。 模型转换过程中,ATC会进行算子调度优化、权重数据重排、内...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装Docker,最新的服务器搭配容器使用
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16