python - 使用 difflib.get_close_matches() 忽略大小写

标签 python difflib

如何告诉 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.']

最佳答案

我没有看到任何快速的方法让 difflib 进行不区分大小写的比较。

快速而肮脏的解决方案似乎是

  • 制作一个将字符串转换为某种规范形式的函数(例如:大写、单行距、无标点符号)

  • 使用该函数生成 {canonical string: original string} 的字典和 [canonical string] 的列表

  • 针对规范字符串列表运行 .get_close_matches,然后通过字典插入结果以取回原始字符串

关于python - 使用 difflib.get_close_matches() 忽略大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11384714/

相关文章:

python - 如何按最佳匹配(difflib 比率)对字符串列表进行排序

python - difflib 输出很奇怪,在每个字符上添加了额外的空格

python - setup.py 可以使用 pip 而不是 easy_install 吗?

python - 如何为没有 .py 文件扩展名的 Python 代码配置 .vimrc?

python - 确定两个大二进制文件的差异?

python - python的difflib.find_longest_match是怎么实现的?

python - 使用 difflib.HtmlDiff 类 - 显示单个字符

python - 使用更改django模板中表单字段的名称属性

python - 已安装模块时获取 flask 无法导入 flask-mysqldb 错误

python - pybind11 STL 自动转换器破坏 std::list 指针