2012-07-08 157 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