銀月の符号

Python 使い見習いの日記・雑記

レシピ追加、正規表現を分割して記述する

073:正規表現を分割して記述する』を追加。 % 演算子の文字列演算で問題なし。

import re

regex1 = 'aaa'
regex2 = 'bbb'
regex = re.compile('%s|%s' % (regex1, regex2))

味付けは正規表現オブジェクトの pattern 属性で。コンパイル済みのオブジェクトからパターン文字列を取り出せる。これで編集しなおしたりくっつけたりできる。後はコンパイルしなおせば OK 。

import re
regex1 = re.compile('aaa')
regex2 = re.compile('bbb')
regex = re.compile('%s|%s' % (regex1.pattern, regex2.pattern))

連結方法に一工夫入れてみる。 Python 2.6, 3.0 で導入された format メソッドとか。

regex = re.compile(
    '%(regex1)s|%(regex2)s' % dict(
                        regex1=regex1.pattern, regex2=regex2.pattern))
regex = re.compile(
    '{regex1}|{regex2}'.format(regex1=regex1.pattern, regex2=regex2.pattern))
regex = re.compile(
    '{regex1.pattern}|{regex2.pattern}'.format(regex1=regex1, regex2=regex2))

締めは locals 関数。 __init__ の記述とかに使われていそうなあいつで。

class Spam(object):
    def __init__(self, spam, ham, eggs):
        # self.spam = spam とか並べる代わりに locals 関数
        for attr, value in locals().items():
            if attr != 'self':
                setattr(self, attr, value)

% 演算子と locals の組み合わせではかえって複雑化する今回の例でも、 format メソッドと locals ならしっくりくる。 Python 2.6以降や 3.0以降の普及が待ち遠しいぜ。

regex = re.compile(
    '{regex1.pattern}|{regex2.pattern}'.format(**locals()))