22

私はちょうどhttp://code.google.com/p/re2を発見しました。これは、長い間無視されてきた方法(Thompson NFA)を使用して、awkの利用可能なエンジンよりも数桁高速な正規表現エンジンを実装する有望なライブラリです。 、Perl、またはPython。

だから私はコードをダウンロードしていつものsudo make installことをしました。/usr/local/include/re2/re2.hしかし、そのアクションは、私のシステムに追加するだけのように見えました。*.aさらにファイルがあるようですが、この*.a拡張子はどうなっているのでしょうか。

Python(できればPython 3.1)のre2を使用したいのですmake_unicode_groups.pyが、ディストリビューションのようなファイルを見ることに興奮していました(おそらくビルドプロセス中に使用されただけですか?)。ただし、それらは私のマシンにはデプロイされませんでした。

Pythonからre2を使用するにはどうすればよいですか?


更新ctypes2人の友好的な人々は、私がソースからDLL / * .soファイルを構築し、Pythonのライブラリを使用してそれらにアクセスすることを試みることができると指摘しました。誰かがそれを行う方法を役立つ指針を与えることができますか?私はここでは、特に最初の部分(* .soファイルの作成)についてはほとんど無知です。


更新私はまた、この質問(以前)をre2開発者グループに投稿しましたが、これまでは返信なしで(これは小さなグループです)、今日は(やや人口の多い)comp.lang.pyグループに投稿しました[—スレッドはこちら—]。さまざまな場所の人々が互いに連絡を取り合うことができることを願っています。私の推測では、熟練した人は、20%のyour-free-time-belongs-google-tooタイムスライスの間に数時間でこれを行うことができます。それは私を何週間も縛ります。Pythonが接続できるようにする必要があるCのフレーバーにC++を自動的にダムダウンするツールはありますか?そうすれば、実行可能な結果を​​得ることが、巧妙なツールチェーンに還元される可能性があります。

(暴言)なぜこれがそんなに難しいのですか?2010年には、まだ豊富なソフトウェアを相互に通信させることはできないと考えています。これは非常に障害であるため、PythonのCコードをアドレス指定する場合は、常にこれらのリンクビットを削除する必要があります。これには多くの作業が必要ですが、CコードのバージョンとPythonのバージョンに固有の拡張モジュールしか提供されないため、古くなります。(/ rant) このようなものを別々のプロセスで実行することは可能でしょうか(たとえば、入ってくるデータの結果を生成できるre2実行可能ファイルがある場合はどうsubprocess/Popen/communicate()でしょうか。(これは、必要になるたびにプロセスを開く必要がある純粋なコマンドラインツールではなく、継続的に実行される単一のプロセスである必要があります。このようなCコードを「悪魔化」するラッパーが存在する可能性があります)。

4

4 に答える 4

15

David Reiss は re2 の Python ラッパーをまとめました。Python の re モジュールのすべての機能を備えているわけではありませんが、それが出発点です。ここから入手できます: http://github.com/facebook/pyre2

于 2010-03-16T19:47:36.673 に答える
5

可能 はい、簡単 いいえ。re2.h を見ると、これはクラスとして公開されている C++ ライブラリです。Python から使用するには 2 つの方法があります。

1.) Tuomas が言うように、それを DLL/so としてコンパイルし、ctypes を使用します。ただし、Python から使用するには、オブジェクトの init とメソッドを C スタイルの外部関数にラップする必要があります。私はこれまで、オブジェクトへのポインタを渡す関数を外部化することにより、ctypes でこれを行ってきました。「init」関数は、後続の各メソッド呼び出しで渡されるオブジェクトへの void ポインターを返します。とても厄介です。

2.) それを真の python モジュールにラップします。繰り返しますが、Python に公開される関数は extern "C" である必要があります。1 つのオプションは、この作業を容易にするBoost.Pythonを使用することです。

于 2010-03-13T18:46:36.000 に答える
3

SWIGは (ctypes とは異なり) C++ を処理するため、より簡単に使用できます。

于 2010-03-13T18:50:03.380 に答える
0

re2 を独自の DLL/so にビルドし、ctypes を使用してその DLL/so から関数を呼び出すことができます。おそらく、DLL などで独自のエントリ ポイントを定義する必要があります。

于 2010-03-13T18:06:16.607 に答える