Python 正则表达式全面指南
爬取电商详情页的实时价格、解析服务器日志提取高危 IP、批量清洗文本里的乱码标签——这些高频又细碎的文本处理任务,正则表达式(Regular Expression,简称正则) 都是 Python 开发者的效率神器。本文将聚焦 Python 内置的 re 模块,从基础语法到高级技巧,再到爬虫实战,系统性地梳理它的用法。
1. 正则表达式基础
1.1 什么是正则
正则是一套专门用来「描述字符串规则」的语法体系,你可以把它理解成文本的“筛子模板”:模板上画好特定的符号组合,符合规则的文本就会被精准“筛出来”,也可以把筛到的部分替换掉。
1.2 入门试手工具
先别急着写 Python 代码,用轻量级在线工具验证思路最快!推荐两款中文常用工具:
- 开源中国在线正则:tool.oschina.net/regex/
- 菜鸟教程在线正则:c.runoob.com/front-end/854
拿一段测试文本做实验:
这里有两个入门匹配演示(注意基础模式的局限性):
- 匹配简单手机号/纯数字前缀单域名邮箱:
\w+@\w+\.\w+→ 仅能抓到类似example@domain.com的邮箱 - 匹配带可选 https 的无边界 URL:
https?://[^\s]+→ 基本能抓全常见 URL,但会带上末尾的标点
2. Python re 模块核心方法
Python 没有内置正则引擎,但提供了标准库 re,封装了常用的操作接口,先看一张速查表:
3. 常用匹配方法详解
3.1 match():开头匹配法
这个方法有个“硬性要求”——必须从字符串第一个字符开始就完全符合规则,否则直接返回 None,特别适合做格式严格的开头验证。
基础用法
分组提取(核心功能!)
如果需要从匹配到的文本里单独抠出某一部分,就用 () 把要抠的内容“框起来”——这就是分组。group(0) 是完整匹配,group(1) 是第一个括号的内容,group(2) 第二个,以此类推。
3.2 search():全局扫描找第一个
和 match() 不同,search() 会跳过开头不符合的部分,找到整个字符串里第一个符合规则的就返回,日常用得比 match() 多得多。
3.3 findall():全局扫描找所有
如果需要一次性提取所有符合规则的内容(比如爬取整个商品列表的所有链接),就用 findall()——它返回的是列表,不用再循环判断。
4. 高级匹配技巧
4.1 贪婪 vs 非贪婪匹配(爬虫必懂!)
这是新手最容易踩的坑——.* 和 * 这类默认是贪婪匹配:会尽可能多地“吞掉”后面的字符;而 .*? 和 +? 这类是非贪婪匹配:会尽可能少地“吞掉”,找到下一个规则的边界就停。
4.2 修饰符(让正则更灵活)
修饰符可以改变正则的默认匹配规则,常用的有 3 个:
4.3 转义匹配(处理特殊字符)
正则里有很多“特殊符号”(比如 . * + ( ) [ ] ?),如果要匹配这些符号本身的字面意思,必须在前面加一个反斜杠 \ 进行转义。
5. 实用辅助方法
5.1 sub():批量替换
这个方法可以一次性替换所有匹配到的文本,适合清理乱码、标签、敏感词等。
5.2 compile():预编译正则(性能优化)
如果需要对大量文本重复使用同一个正则(比如爬 1000 个商品页都用同一个价格匹配规则),先用 re.compile() 预编译成 Pattern 对象,可以避免每次匹配都重新解析正则语法,提升效率。
6. 常用匹配模式速查表
7. 性能优化小提示
虽然正则很强大,但滥用可能导致性能瓶颈甚至卡死程序(比如复杂的贪婪匹配导致的“回溯爆炸”),记住这几点就能避免大部分问题:
- 优先用非贪婪匹配
.*?,减少回溯次数 - 大量重复匹配时用
re.compile()预编译 - 能用字符串内置方法(比如
find()、replace())解决的,就别用正则 - 合理设置边界字符,比如用
[^"]代替.*?匹配双引号里的内容
正则表达式是爬虫开发的入门必备技能,也是文本处理的“瑞士军刀”——掌握基础语法后,建议多拿真实的 HTML、日志文本练手,慢慢积累常用的模式库~

