Python 匹配与搜索的差异
三个接口的差别在起点与终点:match 从字符串开头开始但不要求匹配到结尾,search 会扫描任意位置找第一个匹配,fullmatch 要求整串被匹配完。做校验要用 fullmatch,做提取用 search,只有明确知道内容以某段开头时 match 才合适。
基本信息
| match | 从位置 0 开始尝试,尾部可以有多余内容 |
|---|---|
| search | 从每个位置依次尝试,返回最靠前的匹配 |
| fullmatch | 要求整串被消费完,等价于两端加锚点但更直观 |
| 锚点差异 | 串首锚点与行首锚点在多行模式下含义不同,跨行文本里要区分使用 |
典型使用场景
- 接口参数校验:整串必须符合规则时用 fullmatch,避免尾部夹带内容
- 日志字段提取:内容位置不固定时用 search 按关键字定位
- 固定前缀解析:行首是已知标记时用 match 更快也更清晰
- 多行文本处理:开启多行模式后行首锚点会匹配每一行的开头
- 大文本扫描:用 search 找到第一处即可停止,比全文匹配更省时间
行为差异实测
行为差异实测
import re
bool(re.match(r'a+', 'aab')) # True:只要求从开头匹配,尾部不管
bool(re.fullmatch(r'a+', 'aab')) # False:要求整串匹配
bool(re.search(r'b', 'ab')) # 命中,返回位置 1 的匹配对象
re.search(r'a', 'xxa').span() # (2, 3):search 会向后扫描
# 行首锚点与串首锚点在多行模式下的差别
re.findall(r'(?m)^a', 'a\nb\na') # 两个结果:每行开头都算
re.findall(r'\Aa', 'a\nb\na') # 一个结果:只认整串开头三个接口对照
| 接口 | 起点 | 是否要求到结尾 |
|---|---|---|
| match | 位置 0 | 不要求 |
| search | 任意位置 | 不要求 |
| fullmatch | 位置 0 | 要求整串匹配 |
| findall 与 finditer | 任意位置 | 不要求,返回全部匹配 |
使用位置参数时要注意接口差异:search 与 match 的签名一致,都接受待匹配字符串与起始位置,起始位置会影响行首与串首锚点的判定,做分段匹配时容易在这里出错。
以单行标记处理多行文本时,先按行切分再逐行匹配通常比开启多行模式更易读;两种写法在行尾符处理上有细节差异,涉及具体行为时以官方文档为准。