python - 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,为什么?
解决方案
因为 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
推荐阅读
- wordpress - 如何在重力表单中添加额外的提交按钮?
- matrix - 如何在 APL 中找到矩阵中每一行的平均值?和最高的平均值?
- networking - 如何从不同网络上的另一台计算机访问 localhost?
- reactjs - 选择选项与 react-router BUG 反应
- python - 在 Drake:Python 中可以使用 AddJointActuator 吗?
- python - 如何阻止相关资源出现在 django rest 框架的视图中
- java - 在 Android 中使用 .txt 中的行填充 String[]
- scala - mvn 测试出错:java.lang.IllegalStateException:无法在停止的 SparkContext 上调用方法
- git - 在 git 中,如何避免将较小的更正合并到在原始内容的每一行之间插入一行新内容的分支中的冲突?
- python - Python——执行函数列表的所有排列