在Python中比较字符串以查找错误
我有一个字符串,它是一个单词的正确拼写:
FOO
我想允许别人以一些错误的方式输入这个单词:
FO, F00, F0O ,FO0
有没有什么好的方法来检查这些错误呢?小写字母也应该被视为正确,或者可以把它转换成大写字母。无论哪种方式,看起来都要美观。
3 个回答
1
你可以使用're'模块
re.compile(r'f(o|0)+',re.I) #ignore case
你还可以用大括号来限制出现的次数。你也可以更高级一点,定义自己的'leet'集合,然后用%s把它们加进去
就像这样:
ay = '(a|4|$)'
oh = '(o,0,\))'
re.compile(r'f%s+' % (oh),re.I)
6
一种方法是计算字符串之间的编辑距离。比如,你可以使用莱文斯坦距离,或者自己设计一个距离函数,让0和O看起来更相近,而不是0和P。
另一种方法是把每个单词转换成一个标准形式,然后比较这些标准形式。比如,你可以把字符串转换成大写,把所有的0换成O,把1换成I等等,然后去掉重复的字母。
>>> import itertools
>>> def canonical_form(s):
s = s.upper()
s = s.replace('0', 'O')
s = s.replace('1', 'I')
s = ''.join(k for k, g in itertools.groupby(s))
return s
>>> canonical_form('FO')
'FO'
>>> canonical_form('F00')
'FO'
>>> canonical_form('F0O')
'FO'
2
内置模块 difflib 里有一个叫做 get_close_matches 的函数。
你可以这样使用它:
>>> import difflib
>>> difflib.get_close_matches('FO', ['FOO', 'BAR', 'BAZ'])
['FOO']
>>> difflib.get_close_matches('F00', ['FOO', 'BAR', 'BAZ'])
[]
>>> difflib.get_close_matches('F0O', ['FOO', 'BAR', 'BAZ'])
['FOO']
>>> difflib.get_close_matches('FO0', ['FOO', 'BAR', 'BAZ'])
['FOO']
注意到它没有匹配到你的一种情况。你可以把 cutoff
参数调低一点,这样就能找到匹配了:
>>> difflib.get_close_matches('F00', ['FOO', 'BAR', 'BAZ'], cutoff=0.3)
['FOO']