引言
正则表达式 (Regular Expression)是文本处理的"瑞士军刀",无论是数据清洗、日志分析,还是表单验证 ,它都能大显身手。但因其语法复杂,许多开发者望而却步。本文结合Python的**re模块** ,从基础到实战,手把手教你掌握正则表达式,轻松应对**90%**的文本处理需求!
目录
[2.1 字符组:精准匹配范围](#2.1 字符组:精准匹配范围)
[2.2 元字符:匹配特殊逻辑](#2.2 元字符:匹配特殊逻辑)
[2.3 量词:控制重复次数](#2.3 量词:控制重复次数)
[2.4 分组与转义:复杂规则处理](#2.4 分组与转义:复杂规则处理)
[3.1 match():从开头匹配](#3.1 match():从开头匹配)
[3.2 search():查找首个匹配项](#3.2 search():查找首个匹配项)
[3.3 findall():提取所有结果](#3.3 findall():提取所有结果)
[3.4 sub():替换字符串](#3.4 sub():替换字符串)
一、正则表达式核心概念
-
什么是正则表达式? :通过特定规则描述字符串模式的工具,核心功能是匹配 和替换文本。
-
三大核心用途:
-
验证格式(如手机号、邮箱)。
-
提取内容(如从日志中提取IP地址)。
-
批量替换(如统一日期格式)。
-
二、正则表达式语法精讲
2.1 字符组:精准匹配范围
-
语法 :
[ ]定义匹配范围,支持简写和组合。 -
示例:
-
[0-9a-fA-F]:匹配十六进制字符。 -
[^abc]:匹配非a、b、c的字符。import re
text = "ID: A3B, Hex: 0x1f"
pattern = r"[0-9a-fA-F]+" # 匹配十六进制字符
print(re.findall(pattern, text)) # 输出:['3', '0', '1f']
-
2.2 元字符:匹配特殊逻辑
- 核心元字符表:
| 元字符 | 说明 | 等价写法 |
|---|---|---|
. |
匹配除换行符外的任意字符 | - |
\d |
匹配数字 | [0-9] |
\w |
匹配字母、数字、下划线 | [a-zA-Z0-9_] |
^ |
匹配字符串开头 | - |
示例:验证手机号格式
phone = "17812345678"
pattern = r"^1[34578]\d{9}$" # 匹配11位手机号
print(re.match(pattern, phone)) # 输出:<re.Match object>
2.3 量词:控制重复次数
- 量词分类:
| 量词 | 说明 | 贪婪模式 | 惰性模式 |
|---|---|---|---|
* |
重复0次或多次 | .* |
.*? |
+ |
重复1次或多次 | .+ |
.+? |
{n,m} |
重复n到m次 | {3,5} |
{3,5}? |
示例:提取HTML标签(惰性匹配)
html = "<div>标题</div><p>正文</p>"
pattern = r"<.*?>" # 匹配所有标签
print(re.findall(pattern, html)) # 输出:['<div>', '</div>', '<p>', '</p>']
2.4 分组与转义:复杂规则处理
-
分组
():提取子内容或复用规则。 -
转义
\:匹配元字符本身(如\.匹配点号)。
示例:提取日期
date = "2023-10-05"
pattern = r"(\d{4})-(\d{2})-(\d{2})"
match = re.match(pattern, date)
print(match.groups()) # 输出:('2023', '10', '05')
三、Python实战:re模块四大方法
3.1 match():从开头匹配
text = "Python 3.10 released"
pattern = r"^Python" # 匹配以Python开头的字符串
print(re.match(pattern, text)) # 输出:<re.Match object>
3.2 search():查找首个匹配项
text = "Error: 404 Not Found"
pattern = r"\d+" # 查找第一个数字
print(re.search(pattern, text).group()) # 输出:404
3.3 findall():提取所有结果
log = "IP: 192.168.1.1, User: admin"
pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
print(re.findall(pattern, log)) # 输出:['192.168.1.1']
3.4 sub():替换字符串
text = "联系:17811112222,邮箱:test@example.com"
pattern = r"1[34578]\d{9}"
print(re.sub(pattern, "***隐私保护***", text)) # 输出:联系:***隐私保护***
四、避坑指南:常见问题与优化
贪婪匹配陷阱:
-
错误示例:
r"<.*>"会匹配整个<div>...</div>。 -
修正方案:
r"<.*?>"惰性匹配。
转义符处理:
- Python字符串需写为
\\\\或使用原始字符串r"\\"。
性能优化:
- 避免过度使用
.*,尽量用具体字符组(如\d+替代.*?)。
五、工具推荐:效率提升神器
-
在线测试 :Regex101(实时高亮调试)
-
学习资源 :Python re模块文档
-
可视化工具 :Regexper(生成正则表达式流程图)
本次总结:
正则表达式是程序员必备技能,掌握后能大幅提升文本处理效率。建议结合文中代码多实践,遇到复杂规则时善用工具调试。如果本文对你有帮助,欢迎点赞收藏,关注博主获取更多Python干货!