4

我正在处理一个包含可能重复条目的名称数据库,并试图确定我们有两个,不幸的是,格式不太理想,有些条目的名字、中间名、姓氏或婚前姓被混为一字符串和一些只有第一个和最后一个。

我需要一种方法来查看“John Marvulli”是否与“John Michael Marvulli”匹配,并能够对这些匹配项进行操作。但是,如果您尝试:

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

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

4

3 回答 3

7

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

>>> all(x in 'John Michael Marvulli'.split() for x in 'John Marvulli'.split())
True
于 2013-02-18T17:01:19.617 回答
2

我最近发现了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']
于 2013-02-18T17:33:41.043 回答
0
import re

n1 = "john Miller"
n1 = "john   Miller"

n2 = "johnas Miller"

n3 = "john doe Miller"
n4 = "john doe paul Miller"


regex = "john \\s*(\\w*\\s*)*\\s* Miller"
compiled=re.compile(regex)

print(compiled.search(n1)==None)
print(compiled.search(n2)==None)
print(compiled.search(n3)==None)
print(compiled.search(n4)==None)

'''
output:


False
True
False
False
'''
于 2013-02-18T17:21:10.260 回答