大文字と小文字を区別しないようにdifflib.get_close_matches()に指示するにはどうすればよいですか?キャピタライゼーションを含む定義済みの形式の辞書があります。ただし、テスト文字列には完全な大文字化がある場合とない場合があり、これらは同等である必要があります。ただし、結果は適切に大文字にする必要があるため、変更された辞書を使用することはできません。
import difflib
names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John',
'Acacia koa A.Gray var. waianaeensis H.St.John',
'Acacia koaia Hillebr.',
'Acacia kochii W.Fitzg. ex Ewart & Jean White',
'Acacia kochii W.Fitzg.']
s = 'Acacia kochi W.Fitzg.'
# base case: proper capitalisation
print(difflib.get_close_matches(s,names,1,0.9))
# this should be equivalent from the perspective of my program
print(difflib.get_close_matches(s.upper(),names,1,0.9))
# this won't work because of the dictionary formatting
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9))
出力:
['Acacia kochii W.Fitzg.']
[]
[]
作業コード:
Hugh Bothwellの回答に基づいて、次のようにコードを変更して、機能するソリューションを取得しました(これは、複数の結果が返された場合にも機能するはずです)。
import difflib
names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John',
'Acacia koa A.Gray var. waianaeensis H.St.John',
'Acacia koaia Hillebr.',
'Acacia kochii W.Fitzg. ex Ewart & Jean White',
'Acacia kochii W.Fitzg.']
test = {n.lower():n for n in names}
s1 = 'Acacia kochi W.Fitzg.' # base case
s2 = 'ACACIA KOCHI W.FITZG.' # test case
results = [test[r] for r in difflib.get_close_matches(s1.lower(),test,1,0.9)]
results += [test[r] for r in difflib.get_close_matches(s2.lower(),test,1,0.9)]
print results
出力:
['Acacia kochii W.Fitzg.', 'Acacia kochii W.Fitzg.']