Python: 正規表現のパターンをコンパイルする compile()

Pythonでは正規表現のパターンを何度も使いまわす場合、 reモジュールのcompile()関数であらかじめパターンをコンパイルしておくことができます。

コンパイルしておくことで、正規表現での検索が高速に実行されます。

re.compile()関数の書式

書式
compile(パターン, flags=0)

引数に検索パターン、検索フラグを指定します。検索フラグは省略可能です。
(関連記事:正規表現での検索フラグ flags

戻り値はregexオブジェクトです。 「コンパイル済み正規表現オブジェクト」とも言います。

regexオブジェクトのメソッドとして、 search()、match()、findall()、finditer()、sub()、split()などがあります。
例えばregexオブジェクトのsearch()メソッドは、 モジュールレベル(reモジュール)のsearch()関数と同じ働きをします。 その他のメソッドも同じです

ではパターンをコンパイルしない場合と、 コンパイルする場合のコードを記述して、違いを見てみます。

パターンをコンパイルしない場合

下はモジュールレベル(reモジュール)の search()関数を使ったコードです。 b タグのテキスト部分を取得しています。

import re

# パターン
p = "<b>(.+)</b>"
# 検索対象文字列
s = "<div><b>hello</b></div>"

# search()関数
m = re.search(p, s)

print(m.group(1)) # hello;

パターンをコンパイルする場合

下のコードでは、 まずパターンをコンパイルしてregexオブジェクトを取得しています。 次にregexオブジェクトのsearch()メソッドでマッチングしています。

import re

p = "<b>(.+)</b>"
s = "<div><b>hello</b></div>"

# コンパイル
reg = re.compile(p)

# search()メソッド
m = reg.search(s)

print(m.group(1)) # hello;

同じパターンを使いまわす場合は、 コンパイルした方が高速なのでおすすめです。

2通りの書き方があるため慣れるまでは少し混乱するかもしれません。 要は reモジュールの〇〇関数を使うか、 reモジュールのregexオブジェクトの〇〇メソッドを使うかの違いです。

Python