一、re 模块核心函数(必掌握)
Python 正则核心就 5 个函数,记住基本就能搞定 90% 场景:
表格
| 函数 | 作用 |
|---|---|
re.match() |
从开头匹配,匹配不到返回 None |
re.search() |
全局搜索,找到第一个匹配项 |
re.findall() |
全局查找,返回所有匹配结果列表(最常用) |
re.sub() |
替换匹配到的内容(清洗文本神器) |
re.split() |
根据正则分割字符串 |
基础导入
import re
二、正则基础语法速查表
1. 常用元字符
.:匹配任意单个字符(除换行)^:开头匹配$:结尾匹配*:0 次或多次+:1 次或多次?:0 次或 1 次{n}:恰好 n 次;{n,}:至少 n 次;{n,m}:n~m 次[]:字符集,匹配括号内任意一个字符():分组提取|:或
2. 预定义字符类
\d:数字 0-9\D:非数字\w:字母、数字、下划线\W:非单词字符\s:空白(空格、制表符、换行)\S:非空白
注意:Python 字符串
\需要转义,推荐使用原始字符串r"正则表达式",避免转义问题。
三、实战案例(直接复制运行)
案例 1:匹配手机号
规则:11 位,1 开头,第二位 3/4/5/6/7/8/9
python
text = "我的手机号:13812345678,备用:19987654321,错误号码:123456789"
pattern = r"1[3-9]\d{9}"
res = re.findall(pattern, text)
print(res)
# 输出:['13812345678', '19987654321']
案例 2:提取邮箱
python
text = "联系我:test@163.com,admin@qq.com,错误邮箱abc@"
pattern = r"\w+@\w+\.\w+"
res = re.findall(pattern, text)
print(res)
# 输出:['test@163.com', 'admin@qq.com']
案例 3:分组提取(精准取值)
提取 姓名-年龄 格式中的姓名和年龄
python
text = "张三-22,李四-25,王五-20"
pattern = r"(\w+)-(\d+)"
res = re.findall(pattern, text)
print(res)
# 输出:[('张三', '22'), ('李四', '25'), ('王五', '20')]
案例 4:文本清洗替换(去掉特殊符号、多余空格)
python
text = "Python@正则#实战! 干货总结123"
# 去掉非中文、字母、数字
res = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9\s]", "", text)
# 多个空格替换为单个空格
res = re.sub(r"\s+", " ", res)
print(res)
# 输出:Python正则实战 干货总结123
案例 5:贪婪匹配 vs 非贪婪匹配(高频坑)
- 贪婪:
.*尽可能多匹配 - 非贪婪:
.*?尽可能少匹配
python
text = "<div>标题1</div><div>标题2</div>"
# 贪婪
print(re.findall(r"<div>.*</div>", text))
# 输出:['<div>标题1</div><div>标题2</div>']
# 非贪婪(爬虫必用)
print(re.findall(r"<div>.*?</div>", text))
# 输出:['<div>标题1</div>', '<div>标题2</div>']
案例 6:匹配中文
python
text = "Hello 世界 Python 正则"
pattern = r"[\u4e00-\u9fa5]+"
res = re.findall(pattern, text)
print(res)
# 输出:['世界']
案例 7:split 分割复杂字符串
python
text = "张三,22;李四|25 王五 20"
# 按逗号、分号、竖线、空格分割
res = re.split(r"[,;| ]+", text)
print(res)
# 输出:['张三', '22', '李四', '25', '王五', '20']
四、正则修饰符(flags)
常用 3 个,可组合使用:
re.I:忽略大小写re.S:.匹配换行符(多行文本、爬虫必备)re.M:多行模式,^和$匹配每行开头结尾
示例:
python
text = "Python\npython"
res = re.findall(r"python", text, re.I)
print(res)
# 输出:['Python', 'python']
五、高频避坑总结(面试 & 实战必看)
- 一定要用原始字符串 r"" ,否则
\d会被当成转义字符 - 爬虫提取标签内容,优先非贪婪
.*?,否则匹配整段 match只匹配开头,全局查找用search/findall- 中文正则用
[\u4e00-\u9fa5] - 空格、换行、制表符统一用
\s - 复杂正则可分步写,不要一次性写超长表达式,难调试