[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メソッドの戻り値には加えられません。