【问题标题】:same result from both re.search() and re.match() are the same, but not the same by comparison operatorre.search() 和 re.match() 的结果相同,但比较运算符不同
【发布时间】:2021-02-19 15:44:13
【问题描述】:

这是我的代码,

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,为什么?

【问题讨论】:

  • Match 对象可以处理相同的值,但它仍然是不同的对象。你可以通过内置id()获取对象的唯一ID,你会看到对象的ID不同。
  • 我没有看到打印的输出...

标签: python regex comparison-operators


【解决方案1】:

因为 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

【讨论】:

  • ic,谢谢。我一直认为使用== 是关于比较值,而is 是关于比较对象(或id?)。所以你的意思是,即使值相同,但匹配类型没有__eq__,所以这里不再比较值而是对象本身,这是关于比较id,我说的对吗?
【解决方案2】:

匹配类型没有__eq__ 方法。因此,只要没有 eq 方法,比较运算符就会比较两个对象的内存地址。

__eq__

这是一个神奇的类方法,每当将此类的实例与另一个对象进行比较时都会调用它。如果没有实现这个方法,那么==默认比较两个对象的内存地址。

https://realpython.com/python-is-identity-vs-equality/#how-comparing-by-equality-works

【讨论】:

  • re.match 方法(或者函数?)确实有一个__eq__ 方法。再加上这无关紧要。这是关于其结果__eq__方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2014-03-21
  • 1970-01-01
  • 2020-08-31
  • 2017-05-02
  • 2021-11-07
  • 2018-03-08
相关资源
最近更新 更多