Google製の正規表現ライブラリ「RE2」をpythonで動かす
目次
python で Google の正規表現ライブラリ「RE2」を使いたかったが、インストールで困ったのでメモ。
RE2 とは
RE2 は Google によって開発されている正規表現ライブラリ。
RE2 was designed and implemented with an explicit goal of being able to handle regular expressions from untrusted users without risk. One of its primary guarantees is that the match time is linear in the length of the input string. It was also written with production concerns in mind: the parser, the compiler and the execution engines limit their memory usage by working within a configurable budget – failing gracefully when exhausted – and they avoid stack overflow by eschewing recursion.
高速な正規表現ライブラリで、計算量が入力文字列の長さに対して線形になるアルゴリズムを採用している。正規表現の計算量を利用したReDoS 攻撃を防げるらしい。
詳細は下の記事に詳しく書いてあった。
インストールする
pip でインストールしてみる
何も考えずに pip でインストールしてみた。
$ pip install re2
インストールに失敗した。
_re2.cc:37:10: fatal error: re2/re2.h: No such file or directory #include^~~~~~~~~~~ compilation terminated. error: command 'gcc' failed with exit status 1
本体のインストール
ちゃんとドキュメントを読んでみる。
axiak/pyre2: Python wrapper for RE2
GitHub の readme にちゃんと書いてあった。
To install, you must first install the prerequisites:
- The re2 library from Google
- The Python development headers (e.g. sudo apt-get install python-dev)
- A build environment with
g++
(e.g. sudo apt-get install build-essential)
RE2 本体のインストールが必要らしい。(python-dev・build-seential はすでに入っていたのか、インストールする必要はなかった)
apt-get からインストールできるようなので利用する。(参考)
$ sudo apt-get install -y re2 $ pip install re2
無事インストールが完了した。
公式リポジトリでは easy_install
の使用が推奨されていたようだが、easy_install は deprecated なようなので今回は pip を採用した。
うまく行ったと思ったが..
インストールできたかのように思えたが、まだ罠が待っていた。
ドキュメントのとおりに import する。標準の re モジュールをオーバーラップしているので置き換えるだけで同じように動作するようだ。
import re2 as re
File "/code/cms/functions.py", line 1, in import re2 File "re2.pyx", line 1, in init re2 (src/re2.cpp:13681) NameError: basestring
エラーが発生してしまった。
PyPI 版の re2 モジュールは python3 に対応していないから GitHub から直接 pip でインストールするといいいらしい。
せっかくなので RE2 のリポジトリからリンクを貼られている Facebook のリポジトリのほうがメンテナンスされてイそうなので、こちらからインストールすることにする。
facebook/pyre2: Python wrapper for RE2
$ pip install git+https://github.com/facebook/pyre2
無事インストールが完了し、実行することができた。
ベンチマーク結果などは以下の記事にあったので参考までに。
まとめ
- RE2 本体と Python ラッパーのインストールが必要。
- PyPI でホスティングされているリポジトリ(axiak/pyre2)が Python3 に対応していないなど、メンテナンスされてない感じがあって残念
- RE2 のリポジトリからリンクされていてそこそこメンテナンスもされているfacebook/pyre2を使うと良さそう。
- pip コマンドを使って GitHub から直接インストールすることができる。
参考サイト
- pyre2 を使ってみた | hexacosa.net
- Python3 で re2 を使う
- GitHub のリポジトリを pip install - Qiita
- 高速かつ省メモリな Google の正規表現ライブラリ re2 についてのメモ - naoya_t@hatenablog
- RE2:脆弱な正規表現のリスクをゼロにするライブラリ - VELTRA Engineering - Medium
コメント
Github Issue と連動しています。