[Python] sre.Scannerクラス

環境

この記事の内容は、Ubuntu Linux 6.10, Python 2.4.4c1で確認しました。なお、Python 2.5ではsreモジュールにあったものはreモジュールに移っています。sreモジュールは互換性のために残っていますが、将来は削除される予定です。Python 2.5を使っている場合は、sreモジュールをreモジュールと読みかえてください。

概要

sreモジュールにはScannerクラスがあり、これを使えば簡単にスキャナを作成することができます。

例えば、以下のようなスタイスシートを解析しようとします。

foo {
  bar: baz; /* test */
}

このとき、以下のようなコードを書きます。

try:
    # for Python 2.5 or later
    from re import Scanner
except ImportError:
    # for Python 2.4
    from sre import Scanner

def action(scanner, s):
    return s

def main():
    scanner = Scanner((
            (r"\w+", action), 
            (r"{", action), 
            (r"}", action), 
            (r":", action), 
            (r";", action), 
            (r"\s+", action),           # 空白
            (r"/\*.*\*/", action)))     # コメント

    s = u"""foo {
  bar: baz; /* test */
}
"""

    print scanner.scan(s)

上のmain関数を実行すると、

([u'foo', u' ', u'{', u'\n  ', u'bar', u':', u' ', u'baz', u';', u' ', u'/* test */', u'\n', u'}', u'\n'], u'')

という結果が得られます。

詳細

Scannerクラスのコンストラクタには、

(<正規表現>, <正規表現にマッチしたときに実行する関数>)

を要素とするシーケンスを与えます。正規表現にマッチしたときに実行する関数には、第一引数にScannerオブジェクトが、第二引数にマッチした文字が渡されます。上の例では、この関数にはaction関数を指定し、action関数はマッチした文字列をそのまま返します。

Scannerオブジェクトのscanメソッドで、文字列の解析を行います。scanメソッドの戻り値は、action関数の戻り値のリストと、解析できずに残った文字列です。上の例だと、マッチした文字列のリスト(action関数が文字列をそのまま返すため)と、空文字列(文字列すべてを解析できたため)です。なお、action関数がNoneを返すと、scanメソッドの戻り値には加えられません。