为何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()只从字符串的开头开始匹配,如果目标模式不在字符串最开头,就会返回Nonere.search()会扫描整个字符串,找到第一个匹配的位置
比如如果你的列表里有一个元素是'Charles 234-572-1236',re.match()会返回None,而re.search()依然能找到电话号码。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

