Python 正则表达式实战总结

一、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']

五、高频避坑总结(面试 & 实战必看)

  1. 一定要用原始字符串 r"" ,否则 \d 会被当成转义字符
  2. 爬虫提取标签内容,优先非贪婪 .*?,否则匹配整段
  3. match 只匹配开头,全局查找用 search / findall
  4. 中文正则用 [\u4e00-\u9fa5]
  5. 空格、换行、制表符统一用 \s
  6. 复杂正则可分步写,不要一次性写超长表达式,难调试
相关推荐
mingshili17 小时前
[python] AST语法树来加速大量库文件和注册的加载以及审查
服务器·python
半亩码田17 小时前
为什么 AI 框架几乎全选 Python,而不选 C#?从历史、语言设计和生态三个维度拆解
python·ai编程
basketball61617 小时前
SQL 连接查询用法总结
数据库·sql
arronKler17 小时前
数据库锁总结
数据库·oracle
张小凡vip17 小时前
python的__init__.py说明
开发语言·前端·python
努力努力再努力wz17 小时前
【Redis入门系列】:从 hashtable到 listpack:深入理解 Hash 底层编码、字段级过期、核心命令与缓存应用
开发语言·数据结构·数据库·c++·redis·算法·缓存
小黑随笔17 小时前
Python asyncio 模块学习总结:从“等着”到“切出去干点别的”
开发语言·python·学习
IT策士17 小时前
Django 从 0 到 1 打造完整电商平台:购物车页面增删改查商品数量
后端·python·django
还是鼠鼠17 小时前
AI掘金头条新闻系统 (Toutiao News)-封装通用成功响应格式
数据库·后端·python·fastapi·web