在Python中比较字符串以查找错误

2 投票
3 回答
875 浏览
提问于 2025-04-17 03:13

我有一个字符串,它是一个单词的正确拼写:

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']

撰写回答