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 编程中的技能水平。希望本文对您有所帮助,欢迎继续探索和学习更多关于正则表达式的知识。
20个Python 正则表达式应用与技巧的更多相关文章
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- python正则表达式 小例几则
会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...
- [转] Python正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- Python 正则表达式学习笔记
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- Python 正则表达式 (python网络爬虫)
昨天 2018 年 01 月 31 日,农历腊月十五日.20:00 左右,152 年一遇的月全食.血月.蓝月将今晚呈现空中,虽然没有看到蓝月亮,血月.月全食也是勉强可以了,还是可以想像一下一瓶蓝月亮洗 ...
- 7.Python 正则表达式学习笔记
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- python正则表达式re模块详细介绍--转载
本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆( ...
- python正则表达式教程
原文这里,非常实用,转载一下 再来一篇,两篇一起看,美滋滋 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写 ...
随机推荐
- 【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
问题描述 Azure Redis Cluster 在增加分片数时失败,错误消息为: ResponseBody: { "error": { "details": ...
- Program type already present: com.xxx
该错误是由于工程中存在着相同的类导致(包名与类名都相同),有可能是不同的依赖中有着相同的类,全局搜索该类便可得知
- Redis集群Cluster
Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好 ...
- linux vs code extension C# `GLIBC_2.27' not found
settings中omnisharp:useModernNet改为true reboot虚机
- c语言中int和char之间的转换实例解析
壹: 经常用到c,积累一些小函数,免得下次还要重新写,极大的提升工作效率啊. 贰: 代码很简单,直接上源码: #include <stdio.h> typedef unsig ...
- 解决jenkins Git Publisher自动打tag的问题
简单配置一下 然后开始构建,然后报错如下 The recommended git tool is: NONE using credential 647ee613-5032-4894-aaeb-fe07 ...
- Elasticsearch(es) 查询语句语法详解
Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL.Elasticsearch 查询分类大致分为全文查询.词项查询.复合查 ...
- Mysql中数据类型括号中的数字代表的含义
相信大家不管是看别人的代码,还是自己的代码总会在定义表的数据类型时,会需要在数据类型后面加一个括号,里面写一个参数,例如int(3),smallint(5),char(5)等,但是括号里面的数字到底是 ...
- 记录--H5 实现拍照选景框效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 在实际项目中,遇到了需要唤起手机摄像头拍照的需求,最开始是通过<input type="file" hid ...
- 记录--vue3中的ref,toRef,toRefs
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. ref的使用 ref 接受一个原始值,返回一个具有响应式的对象,对象有一个value属性,其值就是所传递的原始值. ref是做的一个 ...