page contents

Python 的 re 模块中 match() 和 search() 的区别?

学 Python 的时候,正则表达式几乎是绕不开的一个工具,很多人一上来就被 re.match() 和 re.search() 搞晕了。看着差不多,结果运行出来怎么完全不一样?我当初也踩过坑,后来才发现区别其实特别简单。

attachments-2025-10-tccjnd1K68e867f278e3e.png学 Python 的时候,正则表达式几乎是绕不开的一个工具,很多人一上来就被 re.match() 和 re.search() 搞晕了。看着差不多,结果运行出来怎么完全不一样?我当初也踩过坑,后来才发现区别其实特别简单。

match():死板,只认开头

re.match() 的特点就是只能从字符串的开头位置开始匹配,不管你正则写得多完美,只要不是在起点就直接给你 None。举个例子:

import re

text = "hello python"

pattern = r"python"

result = re.match(pattern, text)

print(result)  # None,因为 "python" 不是开头

你看,虽然字符串里确实有 "python",但因为它出现在中间,match() 就认不出来。

search():灵活,满世界找

re.search() 就聪明很多了,它会在整个字符串里“扫一遍”,找到第一个符合条件的地方就停下来。

result = re.search(pattern, text)

print(result)  # <re.Match object; span=(6, 12), match='python'>

这里就能匹配到 "python",位置在索引 6 到 12。它就像是个搜寻器,不局限在开头。

一个更直观的对比

pattern = r"\d+"  # 匹配数字

text = "abc123xyz"

print(re.match(pattern, text))   # None,因为开头不是数字

print(re.search(pattern, text))  # 匹配到 "123"

这样对比下来就很明显了,match() 固执地盯着开头,search() 则会耐心找整段内容。

那什么时候用哪个?

想检查字符串是不是“从某个模式开头”的,就用 match(),比如验证手机号是不是 1 开头。

想看看“有没有出现过某个东西”,那就用 search(),比如一段话里有没有出现过 “error” 关键字。

其实很多情况下我们习惯直接用 search(),因为它更通用,但场景明确时用 match() 会更高效。

一个小提醒

有人会问:那 match() 和 ^ 是不是一样?答案是差不多,但写法不同。你完全可以在 search() 里加 ^ 来限制必须从开头匹配:

print(re.search(r"^hello", "hello world"))  # 匹配成功

这个结果和 re.match("hello", "hello world") 一样。

一句话总结:**match() 盯着开头,search() 全局扫描**。记住这句话基本就不会再搞混。

要是你对正则更感兴趣,其实还可以顺便看看 findall(),它和 search() 又不一样,用来一次性找出所有匹配结果,而不是只停在第一个。这个有机会我再单独聊。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2224 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2224 文章
  3. Pack 1407 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章