我有一個字符串,是一個詞的正確拼寫:在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
您需要準確定義您允許的錯誤類型。 –