我怎么知道difflib.get_close_匹配项()忽略大小写?我有一本字典,它有一个明确的格式,包括大写。但是,测试字符串可能有完全资本化或没有资本化,这些应该是等价的。但是,结果需要适当地大写,所以我不能使用修改过的字典。在
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))
输出:
^{pr2}$工作代码:
根据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.']
我不认为有任何快速的方法可以使difflib进行不区分大小写的比较。在
快速而肮脏的解决方案似乎是
创建一个函数,将字符串转换为某种规范格式(例如:大写、单倍行距、无标点符号)
使用该函数生成{canonical string:original string}的dict和[canonical string]
运行.get_close_匹配规范字符串列表,然后通过dict插入结果以获得原始字符串
@gatopeich的想法是正确的,但问题是可能有许多字符串的大小写不同。我们当然希望他们都能出现在我们的结果中,而不仅仅是其中一个!在
以下自适应可实现此目的:
在进行了大量的搜索之后,我很遗憾地惊讶地发现这个明显的用例没有简单的预先确定的答案。在
唯一的选择似乎是"FuzzyWuzzy" library。然而它依赖于Levenshtein距离,就像Python的
difflib
,而且它的API不是产品质量。{cd2>没有提供更简单的替换方法。在下面是我能想到的最简单的实现方法:
相关问题 更多 >
编程相关推荐