Google製の正規表現ライブラリ「RE2」をpythonで動かす

pythonでGoogleの正規表現ライブラリ「RE2」を使いたかったが、インストールで困ったのでメモ。

RE2とは

RE2はGoogleによって開発されている正規表現ライブラリ。

google/re2: RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.

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.

https://github.com/google/re2/wiki/WhyRE2

高速な正規表現ライブラリで、計算量が入力文字列の長さに対して線形になるアルゴリズムを採用している。正規表現の計算量を利用した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

本体のインストール

ちゃんとドキュメントを読んでみる。

re2 · PyPI

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

エラーが発生してしまった。

Python3でre2を使う

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から直接インストールすることができる。

参考サイト

海老原 祐輔
海老原 祐輔
Yusuke Ebihara