複数行の文字列の各行の先頭からのマッチ
複数行からなる文字列の中から、一行一行のパターンマッチを行う方法を説明します。
基本的に「文字列の先頭」のマッチを行うためのパターンは ^ です。しかし「行ごとの」文字列の先頭という点も考慮しないと、「複数行の文字列の行毎の文字列の先頭」は成功しません。
re.MULTILINE フラグの指定
行毎の先頭を表す ^ の他に、 さらに検索のフラグで re.MULTILINE を指定することで「行毎の文字列の先頭」がマッチします。
次の例を考えます。複数の文字列の中から "404" で始まる行の内容を取得することを考えます。
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
"404.html" という部分はマッチしていません。
(?m) パターンの指定
re.MULTILINE の代わりに、パターンに (?m) を含めることで、行毎のパターンマッチであることを表すことができます。
具体的には、上のコードの9行目を次のように書いても、結果は同じです。
for m in re.finditer(r'(?m)^404[ ]?(.*)', s):
以上、ここでは複数行の先頭にマッチする方法について説明しました。