私の作業では、素晴らしい結果を得て、コードのスペルミスに対する脆弱性を低減するために、ダメラウレーベンシュタイン距離などの近似文字列マッチングアルゴリズムを使用しました。
ここで、TV Schedule for \d\d (Jan|Feb|Mar|...)
などの単純な正規表現に対して文字列を照合する必要があります。これは、文字列TV Schedule for 10 Jan
は0を返しますが、T Schedule for 10. Jan
は2を返します。
これは、正規表現(この場合は100x12)ですべての文字列を生成し、最適な一致を見つけることで実行できますが、これは実用的なシームではありません。
これを効果的に行う方法はありますか?
TREライブラリ を見つけました。これは、正規表現の正確なあいまい一致を実行できるようです。例: http://hackerboss.com/approximate-regex-matching-in-python/ ただし、挿入、削除、置換のみをサポートしています。転置なし。しかし、私はそれがうまくいくと思います。
次のファイルの正規表現を使用して、付属のagrepツールを試しました。
TV Schedule for 10Jan
TVSchedule for Jan 10
T Schedule for 10 Jan 2010
TV Schedule for 10 March
Tv plan for March
そして得た
$ agrep -s -E 100 '^TV Schedule for \d\d (Jan|Feb|Mar)$' filename
1:TV Schedule for 10Jan
8:TVSchedule for Jan 10
7:T Schedule for 10 Jan 2010
3:TV Schedule for 10 March
15:Tv plan for March
すべての提案をありがとうございました。
また参照してください: Python regex(新しいバージョン、2014年10月 )(ドキュメント内で「fuzzy」を検索)。
Python guy(どちらでもない)でない場合、あなたは コンパイルできました コードをC(exe/dll)に変換します。古き良きvb6(など)からのDLL.
から選択する他のライブラリ:
以下も検索:
(実際のリンクを投稿できないことをお詫びします)
regex
module : 'reを置き換えるための代替正規表現モジュールを使用します。'これはre
の親しみやすさを提供しますが、ファジーマッチングのオプション、およびre
のその他のいくつかの改善が含まれています。
Windowsバイナリについては、 このリソース を参照してください。
lexer の使用を検討しましたか?
実際に使ったことはないので、あまり役に立たないのですが、うまくいくようです。
Java近似正規表現マッチングのためのprexと呼ばれるツールを実装し始めました。ツールは、文字列sが正規表現のマッチングからどれだけ離れているかを決定しますr、iesでの挿入、削除、置換の数結果の文字列s 'がrによって受け入れられるように、最低限必要な(最小コスト)です。興味がある場合は、 https://github.com/julianthome/prex からコードを出力します。フィードバックが得られたらとても嬉しいです。このアプローチはまだ少し遅いですが、現在いくつかを組み込んでいますそのパフォーマンスを改善するためのヒューリスティック。