Python re 模块¶
本页定位为标准库
re的对象模型与 API 参考;模式语法和选型先阅读 Python3 正则表达式。
概念与用途¶
re 是 Python 标准正则模块。本页侧重模块对象和匹配结果 API:编译后的 Pattern 可复用,Match 对象提供分组、位置和原始字符串信息。
核心 API¶
Pattern.search()、fullmatch()、finditer() 执行匹配;Match.group()、groups()、groupdict()、span() 读取结果。标志可用 re.IGNORECASE、MULTILINE 等组合。
| 对象/API | 返回或作用 | 注意 |
|---|---|---|
re.compile() |
Pattern |
高频复用并集中标志 |
finditer() |
Match 迭代器 | 比 findall() 保留更多信息 |
groupdict() |
命名组字典 | 未匹配可选组值为 None |
re.escape() |
转义字面文本 | 只用于模式片段,不用于替换串 |
import re
line = "2026-07-17 level=INFO code=200"
pattern = re.compile(r"level=(?P<level>[A-Z]+)\s+code=(?P<code>\d+)")
match = pattern.search(line)
if match:
print(match.groupdict(), match.span("code"))
示例:标志与逐项扫描¶
import re
pattern = re.compile(r"^error:\s*(.+)$", re.IGNORECASE | re.MULTILINE)
log = "INFO: started\nError: disk full\nERROR: timeout"
for match in pattern.finditer(log):
print(match.start(), match.group(1))
编译模式便于注入到函数并测试,也避免在循环中重复表达规则。Python 自身会缓存一部分近期模式,但显式编译仍能为复杂代码提供清晰名称和统一标志。
API 边界¶
findall()的返回形状会随捕获组数量变化;稳定接口优先finditer()。split()会把捕获分隔符放入结果,若不需要请使用非捕获组(?:...)。Match只对应一次搜索结果,不会随原字符串变化而重新匹配。
常见错误与安全注意¶
- 捕获组编号易因模式修改变化,公共解析逻辑优先使用命名组。
.默认不匹配换行,^/$的含义会受MULTILINE影响。- 用户可控模式和长文本可能导致 ReDoS,应限制复杂度、长度或使用线性时间引擎。