2011-09-27 67 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)