正規表現

昨日までとはうってかわって正規表現
う〜ん、あんまし好きじゃないなぁ。
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

これだけ単純な文字列に対しても、速さが一桁違うみたいですねぇ。
正規表現ではテンションがあがりきらず、終了。