You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何re.match()与re.search()返回结果视觉一致但比较运算符判定为不相等?

为什么re.match()和re.search()返回的结果看起来一样,但比较时全为False?

这个问题其实挺常见的,我来给你理清楚背后的逻辑:

首先先看你的代码:

phone_list = ['234-572-1236 Charles', '234-753-1234 Crystal', '874-237-7532 Meg']
import re
result1 = [re.match(r'\d{3}-\d{3}-\d{4}', n) for n in phone_list]
result2 = [re.search(r'\d{3}-\d{3}-\d{4}', n) for n in phone_list]
print(result1)
print(result2)
# why they are not the same?
print(result1 == result2)
print(result1[0] == result2[0])
print(result1[1] == result2[1])
print(result1[2] == result2[2])

核心原因:你在比较的是对象实例,不是匹配内容

re.match()和re.search()返回的都是**re.Match类的实例对象**,而不是直接返回匹配到的字符串。哪怕两个Match对象匹配到的内容完全一致,它们也是内存中两个独立的对象——就像两个长得一模一样的苹果,它们是不同的个体,所以用==比较时,Python会判断它们是不是同一个对象(内存地址是否相同),而不是判断它们的内容是否一致。

这就是为什么打印的时候看起来输出一样(因为Match对象的字符串表示会显示匹配内容),但直接用==比较会返回False。

正确的比较方式:取出匹配内容再比较

如果你想验证两个匹配结果的内容是否一致,需要调用Match对象的.group()方法,取出实际匹配到的字符串,再进行比较:

# 比较第一个元素的匹配内容
print(result1[0].group() == result2[0].group())  # 输出 True

# 批量验证所有元素的匹配内容是否一致
all_match = all(r1.group() == r2.group() for r1, r2 in zip(result1, result2))
print(all_match)  # 输出 True

额外补充:match和search的本质区别

顺便提一句,虽然在你的例子里两者匹配内容相同,但match和search的行为其实不一样:

  • re.match()只从字符串的开头开始匹配,如果目标模式不在字符串最开头,就会返回None
  • re.search()会扫描整个字符串,找到第一个匹配的位置

比如如果你的列表里有一个元素是'Charles 234-572-1236',re.match()会返回None,而re.search()依然能找到电话号码。

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:32:41