2011-09-27 37 views
2

我有一个字符串,是一个词的正确拼写:在python字符串比较发现错误

FOO 

我会允许someine打错字在这样的方法:

FO, F00, F0O ,FO0 

是有一个很好的方法来检查这个?小写也应该被视为正确,或者转换为大写。什么是最漂亮的。

+0

转换为小写可以用[str.lower进行()功能](http://docs.python.org/library/stdtypes.html#str.lower)。同样,如果这是你想要的,[str.upper()函数](http://docs.python.org/library/stdtypes.html#str.upper)。 – GreenMatt

+0

您需要准确定义您允许的错误类型。 –

回答

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

一种方法是计算字符串之间的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' 
+0

你如何确定编辑距离足够好? – Harry

+0

这就是我想知道的:) –

1

您可以使用“重”模块

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)