正規表現
昨日までとはうってかわって正規表現。
う〜ん、あんまし好きじゃないなぁ。
2回生の時の「オートマトンと形式言語」って講義を思い出す。
死ぬほどつまらんかった
まぁいいや。
インスパイヤ先⇒お気楽 Python プログラミング入門:第4回正規表現とジェネレータ
search()とmatch()
search() は文字列の中から正規表現と一致する部分列を検索しますが、match() は文字列の先頭から正規表現とマッチングするか調べるだけです。したがって、先頭文字が正規表現と一致しなければ、match() はマッチング失敗となります。
match() と search() は、マッチングに成功した場合は「マッチオブジェクト (Match Object) 」を返します。失敗した場合は None を返します。Match Obect の主なメソッドを表 5 に示します。
ですってよ。
そしてマッチオブジェクトのメソッドでいろいろな結果が得られる、と。
import re a = re.search(r"\d+", "abcd0123efgh") print a print a.group() print a.start(), a.end() print a.span() b = re.match(r"\d+", "abcd0123efgh") print b
実行結果
D:\workspace\Python\3-3>python test.py <_sre.SRE_Match object at 0x00BDB448> 0123 4 8 (4, 8) None
なるへそ。
正規表現のコンパイル
正規表現は小さなプログラミング言語と同じで、正規表現のままではマッチングに時間がかかります。re モジュールは正規表現をコンパイルすることで、高速なマッチングを実現しています。
ですってよ。
なら試してやろう。
import re, time start = time.clock() a = re.search(r"\d+", "abcd0123efgh") print a.group() print time.clock()-start start = time.clock() p = re.compile(r"\d+") b = p.search("abcd0123efgh") print b.group() print time.clock()-sart
結果
D:\workspace\Python\3-3>python test.py 0123 0.000214480178944 0123 6.717768463e-005
これだけ単純な文字列に対しても、速さが一桁違うみたいですねぇ。
正規表現ではテンションがあがりきらず、終了。