问题: 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)) # None(开头不是数字)
print(re.search(r'\d+', text)) # Match('13812345678')(扫描找到)

# match 若开头匹配也能成功
print(re.match(r'联系方式', text)) # Match('联系方式')

何时用 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 仍仅从字符串开头匹配,而非每行开头。