4

エントリが重複している可能性のある名前のデータベースを調べて、そのうちの 2 つを特定しようとしていますが、残念ながら、フォーマットが最適とは言えず、一部のエントリでは名、ミドル ネーム、姓、または旧姓が 1 つにまとめられています。 string と、first と last だけを持つものもあります。

「John Marvulli」が「John Michael Marvulli」と一致するかどうかを確認し、それらの一致に対して操作を実行できる方法が必要です。ただし、試してみると:

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

False を返します。この方法で 2 つの文字列を比較して、ある名前が別の名前に含まれているかどうかを確認する簡単な方法はありますか?

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 に答える