使用Python比较不同字符串中的数字

时间:2017-03-06 15:18:27

标签: python

我有两种类型的地址:

Unit 5, 123 Fake Street Drive
123 Fake St Dr, Unit 5

如何使用Python通过数字比较两个地址?

例如:

Unit 5, 123 Fake Street Drive -> [5,123]
123 Fake St Dr, Unit 5 -> [123,5]

TRUE

123 Fake Street Drive -> [123]
123 Fake St Dr, Unit 5 -> [123,5]

FALSE

Unit 5, 155 Fake Street Drive -> [155,5]
123 Fake St Dr, Unit 5 -> [123,5]

FALSE

我现在拥有的只是:

if bool(set([int(s) for s in address.split() if s.isdigit()]) & set([int(s) for s in address2.split() if s.isdigit()])):

我想知道一个数字列表是否与另一个数字列表相同,无论顺序如何。

2 个答案:

答案 0 :(得分:3)

您只需构建提取数字的set并将其与==进行比较。 set非常支持平等。

此处的另一个问题是,str.split()5,的效果不会很好。所以isdigit()失败,你的集合不相等。

让我建议re.findall找到数字,将它们放入集合并进行比较,使用\d+\b\d+\b来避免单词内的数字(例如N2P)< / p>

import re

address="Unit 5, 123 Fake Street Drive"
address2 = "123 Fake St Dr, Unit 5"

pattern = r"\b\d+\b"
print(set(re.findall(pattern,address))==set(re.findall(pattern,address2)))

这会产生True,而如果我从上面的一个列表中更改/添加/删除一个号码,我会得到False

正如评论中所建议的那样,如果一个字符串中有重复的数字,则上述情况失败,而另一个字符串中则没有:我们可能会因为set符号重复而产生误报。

如果这是一个问题,那么将set替换为collections.Counter修复

collections.Counter(re.findall(pattern,address))==collections.Counter(re.findall(pattern,address2))

也可以,Counter是一本字典并与其他词典进行比较。

答案 1 :(得分:0)

我建议您使用排序列表,而不是集合。该集合无法区分“单位1,1街道X”和“1街道Y” - 但排序列表将会这样做。