- blogs:
- cles::blog

Python で正規表現の構文木を得るには


Python で正規表現を構文解析だけした結果(内部表現)を得る方法がないかと思って調べてみたところ、sre_parseを使えばできることが分かったのでメモ。
例えば、メールアドレスにマッチする正規表現(^[a-zA-Z0-9_+-]+(.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$
)を parse すると [(AT, AT_BEGINNING), (MAX_REPEAT, (1, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 95), (LITERAL, 43), (LITERAL, 45)])])), (MAX_REPEAT, (0, MAXREPEAT, [(SUBPATTERN, (1, 0, 0, [(ANY, None), (MAX_REPEAT, (1, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 95), (LITERAL, 43), (LITERAL, 45)])]))]))])), (LITERAL, 64), (MAX_REPEAT, (1, MAXREPEAT, [(SUBPATTERN, (2, 0, 0, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57))]), (MAX_REPEAT, (0, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 45)])])), (MAX_REPEAT, (0, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57))])])), (LITERAL, 46)]))])), (MAX_REPEAT, (2, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90))])])), (AT, AT_END)]
という表現を得ることができます。
この表現を sre_compile でコンパイルすると実際に正規表現として利用できるようになるようです。
これを上手く使えば正規表現同士を自動的に合成するようなライブラリを作ったりすることができそうです。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/13130
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . Windows 10 で勝手にログアウトされないようにする(31164)
3 . Word で数式がグレーアウトされていて挿入できないときは(26618)
4 . リモートデスクトップで Alt + PrtSc と同じことをするには(22079)
5 . Visual Studio 2017/2019 で scanf() がエラー(C4996)になるときは(21382)