python difflib.get_close_matches()函数如何工作?

时间:2012-06-04 09:41:30

标签: python string ip difflib

以下是两个数组:

import difflib
import scipy
import numpy

a1=numpy.array(['198.129.254.73','134.55.221.58','134.55.219.121','134.55.41.41','198.124.252.101'], dtype='|S15')
b1=numpy.array(['198.124.252.102','134.55.41.41','134.55.219.121','134.55.219.137','134.55.220.45', '198.124.252.130'],dtype='|S15')

difflib.get_close_matches(a1[-1],b1,2)

输出:

['198.124.252.130', '198.124.252.102']

不应'198.124.252.102''198.124.252.101'最匹配?

我查看了他们已经指定了一些浮动类型权重的文档,但没有关于算法使用的信息。

我需要找出最后两个八位字节之间的绝对差值是否为1(假设前三个八位字节相同)。

所以我首先找到最接近的字符串,然后检查上述条件的最近字符串。

是否还有其他功能或方法可以实现这一目标? get_close_matches()如何表现?

ipaddr似乎对ips没有这样的操作。

3 个答案:

答案 0 :(得分:6)

嗯,docs中有一部分解释了您的问题:

  

这不会产生最小的编辑序列,但确实会产生对人们“看起来正确”的匹配。

为了获得您期望的结果,您可以使用Levenshtein_distance

但是为了比较IP,我建议使用整数比较:

>>> parts = [int(s) for s in '198.124.252.130'.split('.')]
>>> parts2 = [int(s) for s in '198.124.252.101'.split('.')]
>>> from operator import sub
>>> diff = sum(d * 10**(3-pos) for pos,d in enumerate(map(sub, parts, parts2)))
>>> diff
29

您可以使用此样式创建比较功能:

from functools import partial
from operator import sub

def compare_ips(base, ip1, ip2):
    base = [int(s) for s in base.split('.')]
    parts1 = (int(s) for s in ip1.split('.'))
    parts2 = (int(s) for s in ip2.split('.'))
    test1 = sum(abs(d * 10**(3-pos)) for pos,d in enumerate(map(sub, base, parts1)))
    test2 = sum(abs(d * 10**(3-pos)) for pos,d in enumerate(map(sub, base, parts2)))
    return cmp(test1, test2)

base = '198.124.252.101'
test_list = ['198.124.252.102','134.55.41.41','134.55.219.121',
             '134.55.219.137','134.55.220.45', '198.124.252.130']
sorted(test_list, cmp=partial(compare_ips, base))
# yields:
# ['198.124.252.102', '198.124.252.130', '134.55.219.121', '134.55.219.137', 
#  '134.55.220.45', '134.55.41.41']

答案 1 :(得分:1)

来自difflib的一些提示:

  

SequenceMatcher是一个灵活的类,用于比较序列对   任何类型的,只要序列元素是可清除的。基础的   算法比算法早,并且比算法更有趣   由Ratcliff和Obershelp于1980年代后期出版   双曲线名称“格式塔模式匹配”。基本的想法是找到   最长的连续匹配子序列,不包含“垃圾”   元素(R-O不解决垃圾问题)。然后应用相同的想法   递归地到左边的序列和到左边的序列   匹配子序列的权利。这不会产生最小的编辑   序列,但确实倾向于产生对人们“看起来正确”的匹配。

关于根据自定义逻辑比较IP的要求。 您应首先验证字符串是否正确ip。 然后使用简单整数运算编写比较逻辑应该是一个容易完成您的要求的任务。根本不需要图书馆。

答案 2 :(得分:1)

difflib 提及:

<块引用>

基本算法早于 Ratcliff 和 Obershelp 于 1980 年代后期以双曲线名称“格式塔模式匹配”发布的算法,并且比它更高级一些。

就这可能意味着什么而言,“格式塔模式匹配”维基百科页面可以提供一些答案。此外,在维基百科页面的“应用程序”部分中,还提到了 Python difflib 库及其实现。

https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching