正则表达式(Regular Expression)是一种用于匹配、查找和处理字符串的强大工具,通过特殊符号(元字符)定义匹配规则,广泛应用于文本检索、数据清洗、格式验证等场景。Python3 通过内置的
re模块提供了完整的正则表达式支持,本文从基础语法到实战案例,全面解析 Python 正则表达式的使用。
正则表达式的核心是 “元字符”—— 具有特殊含义的符号,用于描述字符的模式。掌握这些元字符是使用正则的基础。
除了*/+/?,还可以用{m,n}精确指定匹配次数:
- 贪婪匹配(默认):尽可能匹配最长的符合规则的字符串(如
*/+/{n,m}默认贪婪)。
- 非贪婪匹配:在量词后加
?,尽可能匹配最短的符合规则的字符串。
示例:
import retext = "aabbaabb"
re模块提供了一系列函数,用于实现正则表达式的匹配、查找、替换等操作,核心函数如下:
- 若匹配成功,返回
Match对象;否则返回None。
- 注意:仅从字符串第一个字符开始匹配,不匹配则返回
None(哪怕中间有符合规则的子串)。
- 扫描整个字符串,返回第一个符合规则的
Match对象;无匹配则返回None。
- 与
match的区别:search不限制从开头匹配。
- 返回一个列表,包含所有符合规则的子串(无匹配则返回空列表)。
- 与
findall类似,但返回Match对象的迭代器(适合处理大量匹配结果,节省内存)。
import retext = "a:1, b:2, c:3"
- 将字符串中所有符合规则的子串替换为
repl(可以是字符串或函数),返回替换后的新字符串。
示例:
- 将正则表达式字符串编译为
RegexObject对象,可重复使用(多次调用时效率更高)。
示例:
通过()定义分组,可以从匹配结果中提取特定部分,这是正则的核心应用之一。
match.group(n):返回第 n 个分组的内容(n=0 表示整个匹配,n=1 开始是分组)。
match.groups():返回所有分组内容的元组。
示例:
import retext = "张三, 年龄:25, 性别:男"
给分组命名,通过group("name")提取,避免记索引。
import retext = "邮箱: user@example.com"
import redef is_valid_email(email):
import reurl = "https://www.example.com/path?query=123"
import retext = "这是一段包含【特殊字符】、<标签>和\n换行的文本!"
-
忘记^和$导致部分匹配:
验证格式时(如手机号),若不加^和$,可能匹配到包含目标模式的长字符串。
错误示例:re.match(r"\d{11}", "13800138000abc") 会返回匹配(实际想验证 11 位纯数字)。
正确做法:re.match(r"^\d{11}$", "13800138000")(确保整个字符串都是 11 位数字)。
-
转义字符处理不当:
正则中\是转义符(如\d表示数字),但 Python 字符串中\也是转义符,需用r前缀定义 “原始字符串” 避免冲突。
错误示例:re.match("\d+", "123")(Python 会将\d解析为转义符,实际应写成r"\d+")。
正确做法:re.match(r"\d+", "123")。
-
贪婪匹配导致结果不符合预期:
例如提取 HTML 标签<div>内容</div>,用<.*>会匹配整个<div>内容</div>(贪婪),而想要匹配<div>需用非贪婪模式<.*?>。
-
过度依赖正则处理复杂场景:
正则适合简单的文本匹配,复杂场景(如 HTML/XML 解析)建议用专用库(如BeautifulSoup),避免正则逻辑过于复杂难以维护。
Python 正则表达式的核心是re模块和元字符系统:
- 元字符定义匹配规则(如
\d匹配数字,*匹配多次);
re模块函数实现具体操作(match/search查找,findall提取,sub替换);
- 分组功能用于精准提取特定内容,命名分组提高可读性;
- 实际使用中需注意贪婪 / 非贪婪匹配、转义字符和边界匹配。
掌握正则表达式能极大提升文本处理效率,建议结合实际场景多练习,逐步熟悉各种元字符的组合用法