[Python] re.compile内で変数を使用する

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\\))')


まとめ


参考

How to add a variable into my re.compile expression

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です