Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;在;不同字长字符串的比较_Python_Comparison_String Comparison_Comparison Operators - Fatal编程技术网

Python“;在;不同字长字符串的比较

Python“;在;不同字长字符串的比较,python,comparison,string-comparison,comparison-operators,Python,Comparison,String Comparison,Comparison Operators,我正在通过一个可能有重复条目的姓名数据库进行工作,并试图确定我们有两个条目,不幸的是,格式有点不理想,一些条目的名字、中间名、姓氏或娘家姓被混成一个字符串,而有些条目只有名字和姓氏 我需要一种方法,看看“约翰·马弗利”和“约翰·迈克尔·马弗利”是否匹配,并能对这些匹配进行手术。但是,如果您尝试: >>> 'John Marvulli' in 'John Michael Marvulli' False 它返回False。是否有一种简单的方法可以通过这种方式比较两个字符串,以查看

我正在通过一个可能有重复条目的姓名数据库进行工作,并试图确定我们有两个条目,不幸的是,格式有点不理想,一些条目的名字、中间名、姓氏或娘家姓被混成一个字符串,而有些条目只有名字和姓氏

我需要一种方法,看看“约翰·马弗利”和“约翰·迈克尔·马弗利”是否匹配,并能对这些匹配进行手术。但是,如果您尝试:

>>> 'John Marvulli' in 'John Michael Marvulli'
False

它返回False。是否有一种简单的方法可以通过这种方式比较两个字符串,以查看一个名称是否包含在另一个名称中?

您需要拆分字符串并查找单个单词:

>>> all(x in 'John Michael Marvulli'.split() for x in 'John Marvulli'.split())
True

我最近发现了
difflib
模块的强大功能。
我想这会让你觉得:

import difflib

datab = ['Pnk Flooyd', 'John Marvulli',
         'Ld Zeppelin', 'John Michael Marvulli',
         'Led Zepelin', 'Beetles', 'Pink Fl',
         'Beatlez', 'Beatles', 'Poonk LLoyds',
         'Pook Loyds']
print datab
print


li = []
s = difflib.SequenceMatcher()

def yield_ratios(s,iterable):
    for x in iterable:
        s.set_seq1(x)
        yield s.ratio()

for text_item in datab:
    s.set_seq2(text_item)
    for gathered in li:
        if any(r>0.45 for r in yield_ratios(s,gathered)):
            gathered.append(text_item)
            break
    else:
        li.append([text_item])


for el in li:
    print el
结果

['Pnk Flooyd', 'Pink Fl', 'Poonk LLoyds', 'Pook Loyds']
['John Marvulli', 'John Michael Marvulli']
['Ld Zeppelin', 'Led Zepelin']
['Beetles', 'Beatlez', 'Beatles']

使用正则表达式(不幸的是,我需要一些时间来找出你需要的确切正则表达式,但正则表达式是你的朋友。快速答案不一定是最好的。你是Stackoverflow新手,你会发现更好的答案通常需要更多的时间发布。阅读“格式有点不理想”,我认为数据库中可能有拼写错误。我的回答检测到
'John Michael Marvulli
'John Michael Marvvvulli
的匹配。对
SequenceMatcher
方法计算的比率设置了一个条件
比率()
使程序能够检测到
约翰·迈克尔·马弗利
约翰·迈克尔·马弗利
的匹配,但对
彼得·迈克尔·马弗利
约翰·迈克尔·马弗利
没有反应。是的,我正在测试,发现我丢失了一个fewAnd,那么,你的结论是什么?我会选择:
设置('John Marvulli.split()).issubset('John Michael Marvulli.split())
如果我想做相反的事情,比如说返回所有不在列表中的用户,该怎么办?在谓词前面添加一个
NOT
。或者你也可以使用@Joel Smith@Wooble
all(John Marvulli.split()中的x代表John Michael Marvulli.split()中的x)
给出了
False
,尽管它们匹配。然后有必要测试这两个顺序。@eyquem:的确;我回答了OP提出的问题,而不是试图猜测他真正想解决的XY问题。这个问题也不区分大小写吗?我测试了,答案是肯定的。我列出了字符串的比率
JOHN Marvuli',JOHN MARVULLI'马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’、‘约翰·马弗利’
对抗约翰·马弗利,其人数不断增加
0.0770.1540.2310.3080.3850.4620.5380.6150.6920.769 0.923.000
h对不起,我在英语或逻辑方面有问题:它是区分大小写的,因为SequenceMatcher实例看到了
'JOHN Marvuli'
'JOHN Marvuli'
之间的区别-好吧,现在,你解决了你的问题了吗?我的解决方案或其他解决方案给你带来了帮助吗?还有问题吗?我正在努力实现你r解决方案但我已经开始拆开difflib库,看看它是如何工作的。应该很快就会完成。@Joel Smith因为我不是英语国家的人,我去()学习“拆开”的意思。据说它的意思是“表达对……的完全否定的意见”。那么,你的句子是否矛盾呢?
['Pnk Flooyd', 'Pink Fl', 'Poonk LLoyds', 'Pook Loyds']
['John Marvulli', 'John Michael Marvulli']
['Ld Zeppelin', 'Led Zepelin']
['Beetles', 'Beatlez', 'Beatles']