複数行の文字列の各行の先頭からのマッチ

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

基本的に「文字列の先頭」のマッチを行うためのパターンは ^ です。しかし「行ごとの」文字列の先頭という点も考慮しないと、「複数行の文字列の行毎の文字列の先頭」は成功しません。

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):

以上、ここでは複数行の先頭にマッチする方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門