最初のアプローチ -
さて、正規表現を使用すると、次のようにすることができます-
import re
re.sub('g+', 'g', 'omgggg')
re.sub('l+', 'l', 'lollll')
等
正規表現を使用することは、この問題に対処するための非常に脆弱で基本的なアプローチであることを指摘しておきます。上記の正規表現を破る文字列をユーザーから簡単に取得できます。私が言おうとしているのは、このアプローチでは、ユーザーが犯すミスのパターンを観察し、ケース固有の正規表現を作成するという点で、多くのメンテナンスが必要だということです。
2 番目のアプローチ -
代わりに、difflib
モジュールの使用を検討しましたか? オブジェクト間のデルタを計算するためのヘルパーを備えたモジュールです。ここで特に重要なのは ですSequenceMatcher
。公式ドキュメントから言い換えると-
SequenceMatcher は、シーケンス要素がハッシュ可能である限り、任意のタイプのシーケンスのペアを比較するための柔軟なクラスです。SequenceMatcher は、2 つのシーケンス間の「人間にわかりやすい差分」を計算しようとします。基本的な概念は、最長の
連続したジャンクのない一致するサブシーケンスです。
import difflib as dl
x = dl.SequenceMatcher(lambda x : x == ' ', "omg", "omgggg")
y = dl.SequenceMatcher(lambda x : x == ' ', "omgggg","omg")
avg = (x.ratio()+y.ratio())/2.0
if avg>= 0.6:
print 'Match!'
else:
print 'Sorry!'
ドキュメントによると、0.6 を超える ratio() はほぼ一致しています。データのニーズに合わせて比率を微調整する必要がある場合があります。より厳密なマッチングが必要な場合は、0.8 を超える値が適切であることがわかりました。