2012-07-08 165 views
6

如何判斷difflib.get_close_matches()忽略大小寫?我有一個包含大寫字母的定義格式的字典。但是,測試字符串可能具有全部大寫字母或不帶大寫字母,並且這些字符串應該是等效的。結果需要適當的大寫,但是,所以我不能使用修改過的字典。忽略大小寫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.'] 
[] 
[] 

工作代碼:

基於休·博思韋爾的回答,我已經修改了代碼如下得到有效的解決方案(這也應該工作更多的時候將返回一個結果):

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.'] 
+0

對不起,重新啓動一箇舊帖子,但我發現這很有趣。對於最終的搜索產品,我正在閱讀代碼,看起來您不需要s1和第一個結果列表。那是對的嗎?看起來算法會產生你想要的結果而沒有這些線。 – 2017-12-22 00:59:01

+0

@TylerRussell,這是正確的。目的是驗證搜索字詞的大小寫沒有影響結果。用s1搜索和用s2搜索產生相同結果的事實表明該算法起作用。通常你只會使用一個搜索詞。 – rudivonstaden 2018-01-09 07:51:38

回答

7

我沒有看到任何快速方法使difflib做不區分大小寫的比較。

快速和骯髒的溶液似乎是

  • 做出將字符串轉換爲一些規範形式的功能(例如:上殼體,單倍行距,無標點)

  • 使用該函數製作{規範字符串:原始字符串}的字典和[規範字符串]的列表

  • 對規範字符串列表運行.get_close_matches,然後通過字典插入結果以獲取原點al弦回

+0

謝謝。這不是優雅的,但它的作品! – rudivonstaden 2012-07-08 18:07:55