Python re库(正则表达式库)的详细指南
1. 模块概述
re
是 Python 标准库中用于正则表达式操作的模块,提供字符串的复杂模式匹配、搜索、替换等功能。正则表达式(Regex)通过特定语法规则描述字符串模式,适用于文本解析、数据清洗、输入验证等场景。
2. 核心概念
**(1) 正则表达式语法**
a
、1
直接匹配自身。.
:匹配任意字符(除换行符,除非启用 re.DOTALL
)。^
:匹配字符串开头。$
:匹配字符串结尾。\d
:匹配数字(等价于 [0-9]
)。\w
:匹配字母、数字、下划线(等价于 [a-zA-Z0-9_]
)。\s
:匹配空白符(空格、制表符、换行等)。[]
:字符集合(如 [a-z]
匹配小写字母)。|
:逻辑或(如 a|b
匹配 a
或 b
)。*
:匹配前一个字符 0 次或多次。+
:匹配前一个字符 1 次或多次。?
:匹配前一个字符 0 次或 1 次。{m}
:匹配前一个字符恰好 m
次。{m,n}
:匹配前一个字符 m
到 n
次。()
:定义捕获组(可通过索引或命名引用)。(?:)
:非捕获组(仅分组,不捕获)。**(2) 修饰符(Flags)**
修饰符 | 描述 |
---|---|
re.IGNORECASE (或 re.I ) |
忽略大小写 |
re.MULTILINE (或 re.M ) |
多行模式(^ 和 $ 匹配每行的开头/结尾) |
re.DOTALL (或 re.S ) |
. 匹配包括换行符在内的所有字符 |
re.VERBOSE (或 re.X ) |
允许正则表达式换行并添加注释 |
3. 常用函数与示例
**(1) 匹配与搜索**
函数 | 描述 | 示例 |
---|---|---|
re.match(pattern, string) |
从字符串开头匹配模式,成功返回 Match 对象,否则返回 None 。 |
re.match(r'\d+', '123abc') → Match 对象(匹配 '123') |
re.search(pattern, string) |
扫描整个字符串查找第一个匹配,成功返回 Match 对象,否则返回 None 。 |
re.search(r'\d+', 'abc123def') → Match 对象(匹配 '123') |
re.findall(pattern, string) |
返回所有非重叠匹配的列表(直接返回字符串或元组列表)。 | re.findall(r'\d+', 'a1b22c333') → ['1', '22', '333'] |
re.finditer(pattern, string) |
返回所有匹配的迭代器,每个元素是 Match 对象。 |
[m.group() for m in re.finditer(r'\d+', 'a1b22')] → ['1', '22'] |
示例代码:
import re
text = "Email: user@example.com, Phone: 123-456-7890"
# 提取邮箱
email = re.search(r'\w+@\w+\.\w+', text).group() # 'user@example.com'
# 提取所有电话号码片段
phones = re.findall(r'\d{3}-\d{3}-\d{4}', text) # ['123-456-7890']
**(2) 替换与分割**
函数 | 描述 | 示例 |
---|---|---|
re.sub(pattern, repl, string) |
将匹配模式的部分替换为 repl ,返回新字符串。 |
re.sub(r'\d+', '#', 'a1b22c') → 'a#b#c' |
re.split(pattern, string) |
按模式分割字符串,返回列表。 | re.split(r'\W+', 'Hello, world!') → ['Hello', 'world', ''] |
示例代码:
# 替换日期格式(YYYY-MM-DD → DD/MM/YYYY)
date = "2023-10-05"
new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', date) # '05/10/2023'
# 分割复杂文本
text = "apple,,banana;;cherry"
parts = re.split(r'[,;]+', text) # ['apple', 'banana', 'cherry']
**(3) 预编译正则表达式**
使用 re.compile()
预编译正则表达式以提高效率(尤其需多次使用同一模式时):
pattern = re.compile(r'\d+')
match = pattern.match('123abc') # 等效于 re.match(r'\d+', '123abc')
**(4) 匹配对象(Match Object)**
成功匹配后返回的 Match
对象提供以下方法:
方法 | 描述 |
---|---|
group(n) |
返回第 n 个分组(默认 n=0 表示整个匹配)。 |
groups() |
返回所有分组的元组。 |
start() / end() |
返回匹配的起始/结束索引。 |
span() |
返回匹配的索引范围元组 (start, end) 。 |
示例:
text = "Date: 2023-10-05"
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text)
if match:
print(match.group(0)) # '2023-10-05'
print(match.group(1)) # '2023'
print(match.groups()) # ('2023', '10', '05')
print(match.span(1)) # (6, 10)
4. 高级技巧
**(1) 非贪婪匹配**
默认量词(如 *
, +
)是贪婪的(尽可能多匹配),添加 ?
可改为非贪婪模式:
# 贪婪匹配
re.findall(r'<.*>', '<div>text</div>') # ['<div>text</div>']
# 非贪婪匹配
re.findall(r'<.*?>', '<div>text</div>') # ['<div>', '</div>']
**(2) 命名分组**
使用 (?P<name>...)
定义命名分组,通过 group('name')
访问:
text = "ID: 123, Name: Alice"
match = re.search(r'ID: (?P<id>\d+), Name: (?P<name>\w+)', text)
print(match.group('id')) # '123'
print(match.group('name')) # 'Alice'
5. 常见问题与注意事项
-
转义字符:在正则表达式中使用
\
需写成\\
,或使用原始字符串r''
简化:python
re.match(r'\d+', '123') # 正确(原始字符串) re.match('\\d+', '123') # 正确(常规字符串需转义)
-
性能优化:
- 多次使用同一模式时,预编译正则表达式(
re.compile()
)。 - 避免过度复杂的正则表达式(如深层嵌套量词)。
-
匹配失败处理:检查
Match
对象是否为None
避免异常:python
match = re.search(r'\d+', 'abc') if match: print(match.group())
6. 应用场景
7. 总结
re
模块通过正则表达式实现高效的字符串模式操作。match()
、search()
、findall()
、sub()
、split()
。group()
、groups()
提取分组内容。作者:wanglaqqqq