質問

たった今発見しました http://code.google.com/p/re2, 、長い間無視されてきた方法を使用する有望なライブラリ (トンプソン NFA) 正規表現エンジンを実装すると、awk、Perl、または Python の利用可能なエンジンよりも桁違いに高速になります。

それでコードをダウンロードしていつものことをしました sudo make install もの。ただし、そのアクションは、追加しただけのようです。 /usr/local/include/re2/re2.h 私のシステムに。いくつかの「」があったようです.afile in addition, but then what is it with this拡張子は「.a」?

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

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


アップデート 2 人の友好的な人が、ソースから DLL / *.so ファイルをビルドしてから Python のファイルを使用できると指摘してくれました。 ctypes ライブラリを使用してそれらにアクセスします。誰かがそれを行うための有用な指針を提供できますか?特に最初の部分 (*.so ファイルの構築) については、私はほとんど無知です。


アップデート この質問も(以前に)に投稿しました re2開発者グループ, 、今まで返事はありませんでした(それは小さなグループです)、そして今日は(やや人口の多い) comp.lang.py グループ [—ここにスレッド—]. 。さまざまな地域の人々が互いに連絡できるようになることを願っています。私の推測では、熟練した人であれば、自分の自由時間の 20% である Google のタイムスライス中に数時間でこれを実行できると思います。それは私を何週間も縛り付けることになるだろう。 C++ を Python が接続できるようにするために必要な C のフレーバーに自動的にダンプダウンするツールはありますか? そうすれば、実行可能な結果を​​得るには、賢いツールチェーンを使用する必要があるかもしれません。

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

役に立ちましたか?

解決

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

他のヒント

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

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

2.) それを真の Python モジュールにラップします。ここでも、Python に公開される関数は extern "C" である必要があります。1 つのオプションは、使用することです ブースト.Python, そうすればこの作業が楽になります。

スイグ (ctypes とは異なり) C++ を処理するため、使用する方が簡単かもしれません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top