问题: re.match() 和 re.search() 函数的基础区别是什么?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
re.match() 从字符串起始位置开始匹配,若开头不匹配则直接返回 None,仅匹配开头;re.search() 扫描整个字符串,返回第一个匹配到的位置,不要求从开头开始。两者均返回 Match 对象,匹配失败返回 None。re.match 等价于在模式前隐式添加 ^ 锚定,而 re.search 无此限制。日常使用中,若需校验整个字符串格式(如手机号)用 match 或 fullmatch,若需从大段文本中查找关键词则用 search。
---
核心差异对比表
| 维度 |
re.match() |
re.search() |
| 匹配起点 |
必须从字符串开头开始 |
从任意位置开始,返回第一个匹配 |
| 匹配失败 |
开头不匹配即返回 None |
整个字符串扫描完无匹配则返回 None |
| 等价锚定 |
相当于模式前加 ^ |
无隐式锚定 |
| 典型场景 |
校验固定格式(如邮箱、手机号) |
从文本中查找子串(如关键词、日期) |
| 返回值 |
Match 对象或 None |
Match 对象或 None |
代码对比示例
1 2 3 4 5 6 7 8
| import re text = "联系方式: 13812345678, 邮箱: test@qq.com"
print(re.match(r'\d+', text)) print(re.search(r'\d+', text))
print(re.match(r'联系方式', text))
|
何时用 re.fullmatch()(补充)
re.fullmatch() 要求整个字符串从头到尾完全匹配,比 match 更严格。常用于表单验证,确保用户输入不包含多余字符。
1 2 3
| phone = "13812345678" print(re.match(r'\d{11}', phone)) print(re.fullmatch(r'\d{11}', phone))
|
常见陷阱与最佳实践
match 误判:re.match(r'\d+', '123abc') 会匹配成功,若要校验纯数字字符串,应使用 fullmatch 或模式 ^\d+$。
- 性能差异:
search 需要扫描整个字符串,match 仅在开头尝试,理论上 match 更快,但差异通常在微秒级,可忽略。
- flags 参数:两者均支持
flags 参数,如 re.IGNORECASE 或 re.MULTILINE,但 MULTILINE 下 match 仍仅从字符串开头匹配,而非每行开头。