Yusuke Ebihara's website
Blog

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

2020/06/23

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

無事インストールが完了し、実行することができた。

ベンチマーク結果などは以下の記事にあったので参考までに。

まとめ

参考サイト