Python技术迷

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

学 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() 又不一样,用来一次性找出所有匹配结果,而不是只停在第一个。这个有机会我再单独聊。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领