正则表达式:检查两个电话号码是否最多相差1个数字

2024-04-29 19:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个电话号码的数据集,我想互相核对一下。基本上,如果两个电话号码最多相差1位,regex应该抛出一个匹配。例如,我们有以下电话号码:

  • +31612345678个
  • +31612245678号

这些数字是相同的,除了位置数字7(第一个数字有一个3,而第二个数字有一个2)。由于这些电话号码相差1位数,正则表达式应该抛出一个匹配。如果电话号码完全相同,正则表达式也应该抛出一个匹配。在以下情况下(见下文),正则表达式不应抛出匹配,因为电话号码相差超过1位数:

  • +31612345678个
  • +31611145678号

有人在想一个好的正则表达式吗?我正在用python中的re模块编写regex。你知道吗


Tags: 模块数据re情况电话号码数字regex见下文
3条回答

根据您的用例-如果您还想捕获“哦,您错过了一个数字”或“呃,那个数字不应该在那里”,请使用两个数字之间的编辑距离。你知道吗

您可以使用levenshtein编辑距离来获取两个数字之间需要多少“编辑”的数字,例如使用python的editdistance库。你知道吗

>>> import editdistance
>>> editdistance.eval('banana', 'bahama')
2L

这可能不是最好的代码,但它可以做到这一点。你知道吗

from collections import Counter
a = '+31612345678'
b = '+31612245678'

def match(p1, p2):
    ct = Counter([a == b for a, b in zip(p1, p2)])
    if not ct[False] > 1:
        <throw match>

你不会用正则表达式来表达这个。如果你的电话号码长度相同

def is_match(phone_nr_1, phone_nr_2):
    diff = filter(lambda x: x[0] != x[1],
                  zip(phone_nr_1, phone_nr_2))

    return len(diff) <= 1

print is_match("+31612345678", "+31612245678")
#=> True

print is_match("+31612345678", "+31611145678")
#=> False

我会做的。你知道吗

相关问题 更多 >