2012-03-05 3 views
4

:それは次回変更される前にPerlの `study`に相当するPythonはありますか? Perlの<a href="http://perldoc.perl.org/functions/study.html" rel="nofollow">documentation</a>から

studyは(未指定の場合は$ _)SCALARを研究するために余分な時間がかかります 多くのパターンをしているのを見越して、文字列に一致します。これは、検索するパターンの性質と数、および検索する文字列の文字頻度の分布 に応じて、 時間を保存することも、保存しないこともあります。

私はPythonでやっているいくつかの正規表現駆動解析をスピードアップしようとしています。私はこのトリックをPerlから思い出しました。私は、高速化があるかどうかを判断するためにベンチマークを行う必要があることを理解していますが、Pythonでは同等のメソッドを見つけることができません。

+1

Pythonでは、正規表現オブジェクトを 're.compile(...) 'でコンパイルすることができますが、正規表現側は対象です。私は、検索対象の文字列を調べるPythonのことについて何も聞いていません。 – Frg

+0

これは基本的に[効率的な検索のためのプリプロセス文字列](http://stackoverflow.com/q/9370740/1183387)と同じ質問です。おっとっと! – bonsaiviking

+1

Pythonに実際にマッチを遅くし、ASCIIをはるかに超えて処理しない機能があるかどうか尋ねていますか? (私は彼らが 'study'を5.16でno-opにしていると思います)。 – ikegami

答えて

6

私が知る限り、このようなものはPythonに組み込まれていません。しかしthe perldocによると:

研究が動作する方法はこれです:検索される 文字列内のすべての文字のリンクリストが作られたので、私たちは知っている、例えば、すべての 「K」の文字はどこさ。各検索文字列から、 Cプログラムと英語テキストから構築された静的な頻度テーブルに基づいて、希少文字は が選択されています。この 「希少な」文字を含む場所だけが調べられます。

これはあまり洗練されていないと思われます。おそらく、あなた自身と同等のものを一緒にハックする可能性があります。

esmreは多少似ています。 as @Frg notedの場合、正規表現を再利用する場合は、re.compileを使用することをおすすめします(regex自体を何度も再解析するのを避けるため)。

それとも、(ここでone implementationだ、あるいはここC extension with unicode supportです)またはsuffix arraysimplementationsuffix treesを使用することができます。

+0

興味深い読書をありがとう。あなたのリンクはemsreではなく、[esmre](https://code.google.com/p/esmre/)でなければなりません。私はこの時点で私が「勉強」能力を必要としていないと確信していますが、あなたの答えはとても役に立ちました。私はすでに正規表現をコンパイルしていました。 – bonsaiviking

8

Perlの調査は、もはや実際にはあまり効果がありません。正規表現は、studyが作成されたときよりもずっと賢くなりました。

たとえば、Aho-Corasick予測を使用して代替案をトライ構造にコンパイルします。

perl -Mre=debugで実行すると、正規表現のコンパイラと実行エンジンが適用される賢明さの種類が表示されます。

関連する問題