Pythonで正規表現パターンをコンパイルして正規表現オブジェクトを作る際に、正規表現パターンを変数にしたい場合がある。
例えば ‘Cat’ が含まれる正規表現オブジェクトを作りたい場合、re.compile()
を使用して以下のように書く。
>>> prog = re.compile('Cat')
‘Cat’ を ‘Dog’ に変更したくなった場合には、’Cat’ の部分を ‘Dog’ に変更すればよい。
>>> prog = re.compile('Dog')
その後も’Elephant’ や ‘Monkey’ などに変更したくなるかもしれないため、できれば以下のように動物名を変数化しておきたい。
>>> animal_name = 'Dog'
パターン全体を変数にしたい場合
上記のようにパターン全体を変数とする場合には、単純に
>>> prog = re.compile(animal_name)
と引数にそのまま変数を指定すればよい。
パターンの一部に変数を使用したい場合
では、パターンの一部に変数を使用したい場合はどうすればよいか?
例えば、先頭が ‘Cat’ から始まるオブジェクトを作りたい場合、Catの前に ^
(キャラット)を置いて以下のようになる。
>>> prog = re.compile('^Cat')
このCatを変数に置き換えたい場合、どのよう記述すればよいのだろうか?
そんなときには変数部分を ( ) で囲み、format()
メソッドを使用すれば良い。記述方法は以下になる。
>>> animal_name = 'Cat'
>>> prog = re.compile('^({})'.format(animal_name))
語尾が ‘Cat’ で終わるオブジェクトを作る場合には、最後に $
(ドルマーク)を置いて
>>> prog = re.compile('({})$'.format(animal_name))
>>> prog
re.compile('(Cat (Mew))$')
とすればよい。
変数に特殊文字が含まれる場合
また、その変数にカッコ( ( )
)やパイプ記号( |
)、またはバックスラッシュ( \
)などの特殊文字が含まれている場合には注意が必要。
re.escape()
を使用して特殊文字をエスケープ(無効化)したうえでcompileするとよい。
>>> animal_name = 'Cat (Mew)'
>>> escaped_animal_name = re.escape(animal_name)
>>> escaped_animal_name
'Cat\\ \\(Mew\\)'
>>> prog = re.compile('^({})'.format(escaped_animal_name))
>>> prog
re.compile('^(Cat\\ \\(Mew\\))')