python re(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
正则表达式是什么?为什么需要学习 Python re?
正则表达式(Regular Expression,简称 regex)是文本处理的瑞士军刀,它通过特定语法定义字符串匹配规则,帮助开发者快速定位、提取或替换文本中的模式。在 Python 中,re
模块提供了对正则表达式功能的完整支持。无论是验证用户输入、解析日志文件,还是从网页中提取数据,掌握 python re
技巧都能显著提升开发效率。
想象正则表达式如同一张寻宝图:它指引程序在文本的海洋中精准定位目标信息,而 re
模块就是 Python 世界的指南针。接下来,我们将通过循序渐进的方式,探索如何用 python re
解决实际问题。
一、基础语法:匹配字符串的入门指南
1.1 基本匹配规则
正则表达式的核心是模式字符串(Pattern)。例如,要匹配字符串中的 "hello",只需将模式直接写入:
import re
text = "hello world"
result = re.search(r"hello", text)
print(result.group()) # 输出:hello
这里 r"hello"
表示原始字符串,避免转义字符冲突。re.search()
函数扫描整个字符串,找到第一个匹配项。
1.2 匹配任意字符
使用 .
元字符可以匹配除换行符外的任意单个字符:
text = "a1b"
match = re.search(r".1.", text)
print(match.group()) # 输出:a1b
1.3 开始与结束锚点
^
表示字符串开始位置$
表示字符串结束位置
text = "start_end"
print(re.match(r"^start", text)) # 匹配成功
print(re.search(r"end$", text)) # 匹配成功
二、常用元字符详解:构建强大匹配规则
2.1 量词:控制匹配次数的魔法
元字符 | 含义 | 示例 |
---|---|---|
* | 匹配前一个字符 0 次或多次 | a*b 匹配 "b", "ab", "aaab" |
+ | 匹配前一个字符 1 次或多次 | a+b 匹配 "ab", "aaab" |
? | 匹配前一个字符 0 次或 1 次 | a?b 匹配 "b", "ab" |
{n} | 匹配前一个字符恰好 n 次 | a{2}b 匹配 "aab" |
text = "aaaab"
print(re.match(r"a+b", text).group()) # 输出:aaaab
2.2 字符组与范围匹配
[]
定义字符组,匹配其中任意一个字符[0-9]
匹配数字[^0-9]
匹配非数字字符
phone = "138-1234-5678"
print(re.match(r"\d{3}-\d{4}-\d{4}", phone)) # 匹配成功
2.3 分组与捕获:提取子字符串
使用 ()
对匹配内容进行分组:
text = "商品编号:AB123"
match = re.search(r"商品编号:(\w+)", text)
print(match.group(1)) # 输出:AB123
三、进阶技巧:让正则表达式更智能
3.1 预编译:提升性能的利器
当需要多次使用同一模式时,建议预编译:
pattern = re.compile(r"(\d{4})-(\d{2})-(\d{2})")
dates = ["2023-01-15", "2024-03-20"]
for date in dates:
print(pattern.match(date).groups())
3.2 贪婪与非贪婪模式
默认量词是贪婪的,会尽可能多匹配。添加 ?
可切换为非贪婪模式:
text = "<div>内容1</div><div>内容2</div>"
print(re.match(r"<div>.*</div>", text).group())
print(re.match(r"<div>.*?</div>", text).group())
3.3 多行与忽略大小写模式
re.IGNORECASE
忽略大小写re.MULTILINE
启用多行模式
text = "Apple\napple\nAPPLE"
print(re.findall(r"apple", text, re.IGNORECASE)) # 输出:['Apple', 'apple', 'APPLE']
四、实战案例:解决真实世界问题
4.1 提取邮箱地址
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
text = "联系邮箱:user@example.com 和 test@domain.org"
emails = re.findall(email_pattern, text)
print(emails) # 输出:['user@example.com', 'test@domain.org']
4.2 过滤敏感词
def filter_words(text):
sensitive_words = ["敏感词1", "敏感词2"]
pattern = r"\b(" + "|".join(map(re.escape, sensitive_words)) + r")\b"
return re.sub(pattern, "***", text, flags=re.IGNORECASE)
print(filter_words("这个内容包含敏感词1和敏感词2"))
4.3 解析日志文件
log_line = '2023-03-15 14:22:33 INFO User login'
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\w+) (.+)'
match = re.match(pattern, log_line)
print(f"日期:{match[1]}, 时间:{match[2]}, 级别:{match[3]}, 内容:{match[4]}')
五、常见问题与最佳实践
5.1 避免过度复杂化
过于复杂的正则表达式会降低可读性,建议:
- 分解为多个简单模式
- 使用注释模式
re.VERBOSE
- 结合其他文本处理方法
5.2 处理特殊字符
需要匹配特殊元字符时,用反斜杠转义,或使用 re.escape()
:
special_str = "+.[]"
escaped = re.escape(special_str) # 输出:\+\.\[\]
5.3 性能优化
- 避免使用
.*
这样的贪婪模式 - 优先使用预编译模式
- 对小文本优先使用字符串方法(如
str.startswith()
)
结语:让正则表达式成为你的文本处理利器
通过本文的系统学习,读者已掌握了从基础语法到实战应用的完整路径。正则表达式如同一把双刃剑:合理使用能极大提升工作效率,但过度复杂化反而会适得其反。建议在开发中遵循以下原则:
- 先验证再编写:使用在线工具(如 regex101.com)调试模式
- 分步构建:逐步增加匹配规则,而非一次性写出复杂模式
- 文档化:为复杂正则表达式添加注释说明
在 Python 的世界中,python re
模块始终是处理文本的得力助手。通过持续练习和实际应用,您将能更自如地驾驭这一强大的文本处理工具。