首页 > 解决方案 > re.search() 和 re.match() 的结果相同,但比较运算符不同

问题描述

这是我的代码,

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() 来获得相同的结果。但是当通过比较运算符比较结果时,这一切都给了我 False,为什么?

标签: pythonregexcomparison-operators

解决方案


因为 Match 类型没有自定义__eq__方法,所以相等操作将始终返回 False,除非它是完全相同的 Match 实例。

相等比较(== 和 !=)的默认行为基于对象的标识。因此,具有相同身份的实例的相等比较导致相等,而具有不同身份的实例的相等比较导致不平等。

https://docs.python.org/3/reference/expressions.html#value-comparisons

每次调用 re.match 或 re.search 时,返回值都会是不同的 Match 对象,即使输入数据完全相同。

>>> needle, haystack = 's', 'spam'                                                                                                                                                                                                  
>>> re.match(needle, haystack) == re.match(needle, haystack)                                                                                                                                                                        
    False

推荐阅读