Python 入門

ホーム > 正規表現 > MULTILINE オプションを指定する

MULTILINE オプションを指定する

複数行からなる文字列の中から、一行一行のパターンマッチを行う方法を説明します。

さっそく具体例を示します。

ここでやりたいことは、「複数行の文字列の中で 404 という文字で始まる行の文字列を拾いたい」ということとします。 ある種のログファイルの解析をしている状況を考えてもらえば良いと思います。

そこで、次のように finditer 関数を使うとします。(finditer については、 「繰り返しマッチは finditer を使おう」を参考にしてください)

import re

s = """
200 /abc.html 
200 /vdir/foo.html
404 /xxx.html
200 /404.html
404 /abc.html 
"""
for m in re.finditer(r'404(.*)', s):
	print m.group(1) 

この結果は次のようになります。

 /xxx.html
.html
 /abc.html 

運悪く(というかわざとらしく(苦笑))、拾いたい文字列のなかに 404.html などというキーワードを含むデータが入っていたために、 .html などという不要なデータが紛れ込んでしまいました。

こうした問題を排除して、一行一行のチェックを行うには、パターンマッチの中に行の冒頭を表す ^ を含め、 さらに検索のフラグで re.MULTILINE を指定します。

import re

s = """
200 /abc.html 
200 /vdir/foo.html
404 /xxx.html
200 /404.html
404 /abc.html 
"""
for m in re.finditer(r'^404(.*)', s, re.MULTILINE):
	print m.group(1) 

すると、結果は期待したように、404ではじまる行のデータのみが取得できました。

 /xxx.html
 /abc.html 

ちなみに、この re.MULTILINE オプションですが、次のようにパターンマッチの中に (?m) としても同じ意味になります。

for m in re.finditer(r'(?m)^404(.*)', s):

蛇足ですが、^ だけ指定してマルチラインのオプションを指定しなければ単にマッチしません。

ホーム > 正規表現 > MULTILINE オプションを指定する