2013年6月24日月曜日

Pythonで正規表現の勉強をしてみる。 その2

今日はzero-width-assertionについて例を交えながらやっていく。

\d
任意の十進数とマッチ。[0-9]と同じ。
print re.search(r"\d\d", "this isn't 999.").group()
ちなみに\Dにすると否定になる([^0-9]と同じ)

\s
任意の空白文字とマッチする。[\t\n\r\f\v]と同じ。
ちなみに\Sにするとその逆になる。

\w
英数字と下線[a-zA-Z0-9_]と同じ。 ちなみに\Wはその否定となる。
print re.search(r"\w*", "this isn't 999.").group()



 |
orと同じ。
print re.match(r"[a|b]cd", "bcd").span()

^
行の先頭にマッチするという条件を付加する。

print re.search(r"^happy", "happy as hell")
はマッチするが、
print re.search(r"^happy", "are you happy?")
はマッチしない。

$
行の末尾を意味する。
print re.search(r"pen.$", "this is a pen.")


\b
単語の境界を意味する。つまり空白か非英数文字
print re.search(r"\bis\b", "this is a pen.")
はいいけど
print re.search(r"\bis\b", "this isn't a pen.")
はマッチしない。

グルーピング
()でくくることでグルーピングできる。.group()メソッドでそれを取り出せる。
print re.search(r"(a([b|c])d)", "acd.").group(0)
print re.search(r"(a([b|c])d)", "acd.").group(1)
print re.search(r"(a([b|c])d)", "acd.").group(2)


LookAhead Assertions(先読みアサーション)

よく分からん名前がついとるけど、これはif文みたいなもの。
例えばファイル名を名前部分と拡張子とに分けた形でマッチしたいとき
print re.match(r".*[.].*$", "base.txt").group()
とすればよい。「.」(dot)はなんでもよいという意味。

「.bat」の拡張子の拡張子を除外したいときは
print re.match(r".*[.](?!bat$).*$", "base.txt").group()
と(?!bat$)を加える。

この(?~)がifみたいなもので?以下の条件ならマッチングを続けるということらしい。
今回はその否定で「!」が挿入されている。
が肯定の場合は(?=~)。

条件を追加してexeも除外したいときは、
print re.match(r".*[.](?!bat|exe$).*$", "base.txt").group()
とする。






0 件のコメント:

コメントを投稿