python中的数据匹配(fuzzy,levenstein?)

python中的数据匹配(fuzzy,levenstein?),python,matching,levenshtein-distance,fuzzy,Python,Matching,Levenshtein Distance,Fuzzy,我想做一些类似excel模糊v形查找的事情,但用python。 我有一个约10000个串联字符串的列表,如: JohnSmith5159LosAngeles JaneDo7729NewYork etc 我希望在格式相同的列表中查找类似的字符串(我希望指定%match),并将匹配项放在相邻的列中。这可能会带来如下结果: JohnSmith5159LosAngeles | JohnDSmith5159LosAngelez JaneDo7729NewYork | JaneDoe771

我想做一些类似excel模糊v形查找的事情,但用python。 我有一个约10000个串联字符串的列表,如:

JohnSmith5159LosAngeles
JaneDo7729NewYork
etc
我希望在格式相同的列表中查找类似的字符串(我希望指定%match),并将匹配项放在相邻的列中。这可能会带来如下结果:

JohnSmith5159LosAngeles |  JohnDSmith5159LosAngelez
JaneDo7729NewYork       |  JaneDoe7719NewYork
etc            

有人知道是否有一个简单的已知脚本或方法来实现这一点吗?Pleasse:)

内置的difflib能够返回字符串相似性的比率

然后我编写了一个函数来返回最大相似性的字符串,只要两个字符串之间的相似性比大于或等于0.9

有一个小的快捷方式来检查两个字符串的第一个字母是否匹配。如果不是,则不运行计算。这个想法来自这里:

我假设您正在使用pandas,所以我添加了一个示例,说明如何使用结果填充pandas数据框

from difflib import SequenceMatcher

def similar(a, b):
    """ https://stackoverflow.com/a/17388505/42346 """
    return SequenceMatcher(None, a, b).ratio()

def max_similar_string(s, l):
    first_letter_match = [i for i in l if s[0] == i[0]]
    if len(first_letter_match):
        max_ratio = 0
        max_ratio_string = ''
        for i in l:
            ratio = similar(i,s)
            if ratio > max_ratio:
                max_ratio = ratio
                max_ratio_string = i
        if max_ratio >= 0.9:
            return (max_ratio_string,max_ratio)
    else:
        return (np.nan,np.nan)

l = ['JohnDSmith5159LosAngelez','JaneDoe7719NewYork']

df = pd.DataFrame({'s':['JohnSmith5159LosAngeles','JaneDo7729NewYork']}) 

for idx in df.index: 
    df.loc[idx,'similar'], df.loc[idx,'ratio'] = max_similar_string(df.loc[idx,'s'],l) 
结果:

                         s                   similar     ratio
0  JohnSmith5159LosAngeles  JohnDSmith5159LosAngelez  0.936170
1        JaneDo7729NewYork        JaneDoe7719NewYork  0.914286

查一下水母图书馆。它有一系列字符串相似性度量。我在excel中编写了一个函数,但它太慢了,我不知道如何将它转换为python:/@scotthunter这非常有用!Thanks@HenriettaShalansky:不客气!很高兴见到你。