2016-04-12 57 views
0

私は名前を取り、それをフォーマットし、それを他の名前のリストと比較して何回一致するかを調べるpythonスクリプトを持っています。問題は、それが私がスクリプトに入力したくない中間のイニシャルを持つために比較される名前です。文字列の比較でワイルドカードを組み込む

list_of_names = ['Doe JM', 'Cruz CR', 'Smith JR', 'Doe JM', 'Maltese FL', 'Doe J'] 

ここで、名前を再フォーマットする簡単な機能があります。

f_name = name_format('John','Doe') 
print(f_name) 

> 'Doe J' 

今、私は毎回「ドウJ」または「ドウJM」が表示され、値がtrueの比較を行いたいです。以下の機能は意図したとおりに動作しません。

def matches(name, list): 
    count = 0 
    for i in list: 
     if i == name: 
      count = count + 1 
     else: 
      pass 
    return(count) 

print (matches(f_name, list_of_names)) 

> 1 

私の目標は、これらを行うには3への復帰が同じようにすることです、私はこのケースでは「ドウJM」内の「M」になるミドルネームのイニシャルを無視します。

私がしたいことは、名前を「Doe J」にフォーマットする行に沿ったものです。どこ? 'ワイルドカードです。私はfnmatchをインポートしようとしましたが、いくつかのツールを使用しましたが、失敗しました。

答えて

1

に、とします。関数は、重複した値を返します、あなたはを使用する必要がある、それを削除するためのを設定します。

list_of_names = ['Doe JM', 'Cruz CR', 'Smith JR', 'Doe JM', 'Maltese FL', 'Doe J'] 

# List of names 
def check_names(part_names, full_name_list): 
    for full_name in full_name_list: 
     for part_name in part_names: 
      if part_name in full_name: 
       yield full_name 

result = set(check_names(['Doe J', 'Cruz'], list_of_names)) 

# One name 
def check_names(name, full_name_list): 
    for full_name in full_name_list: 
     if name in full_name: 
      yield full_name 

result = check_names('Doe J', list_of_names) 

print list(result) # List of result 
print len(result) # Count of names 
+0

'full_name.startswith(part_name)'が 'in'でテストするよりも安全です。 – Norman

+0

@Normanは、名前のデータベースの目標と内容に依存します。私はTSが小さな変更を加えることができると思う。その目的は、そのような場合にどのように変換が起こるかを示すことでした。 – JRazor

0

あなたはreモジュールと正しい軌道に乗っていました。私はあなたの問題を解決するには以下のようになり信じる:

import re 
def matches(name, name_list): 
    regex = name + '\w?' # Allows one addition word character after the name 
    result = list(map(lambda test_name: re.match(regex, test_name) is not None, name_list)) 
    return result.count(True) 

print(matches(f_name, list_of_names)) 
# 3 

このソリューションは、1つの英数字の文字が名前の後に許可されていることを保証します。