我有一个字符串,是一个词的正确拼写:在python字符串比较发现错误
FOO
我会允许someine打错字在这样的方法:
FO, F00, F0O ,FO0
是有一个很好的方法来检查这个?小写也应该被视为正确,或者转换为大写。什么是最漂亮的。
我有一个字符串,是一个词的正确拼写:在python字符串比较发现错误
FOO
我会允许someine打错字在这样的方法:
FO, F00, F0O ,FO0
是有一个很好的方法来检查这个?小写也应该被视为正确,或者转换为大写。什么是最漂亮的。
内置模块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']
一种方法是计算字符串之间的edit distance。例如,您可以使用Levenshtein distance或创建自己的距离函数,该距离函数将0和O比0和P更接近。
另一种是将每个单词转换为规范形式,并比较规范形式。例如,你可以将字符串转换为大写字母,用Os替换所有的0,用Is替换1,等等,然后删除重复的字母。
>>> 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'
你如何确定编辑距离足够好? – Harry
这就是我想知道的:) –
您可以使用“重”模块
re.compile(r'f(o|0)+',re.I) #ignore case
你可以使用大括号来限制出现的次数太多。你也可以得到“花哨”和定义“莱特”套在W /%S
中添加它们:
ay = '(a|4|$)'
oh = '(o,0,\))'
re.compile(r'f%s+' % (oh),re.I)
转换为小写可以用[str.lower进行()功能](http://docs.python.org/library/stdtypes.html#str.lower)。同样,如果这是你想要的,[str.upper()函数](http://docs.python.org/library/stdtypes.html#str.upper)。 – GreenMatt
您需要准确定义您允许的错误类型。 –