[Python] 正規表現で、改行を含む文字列をマッチさせる
こんにちは、@yoheiMuneです。
正規表現で文字列を扱う際に、改行が含まれる場合は少し考慮が必要です。今日はその対応方法をブログに書きたいと思います。
下記のように正規表現を書くと、改行を含む箇所が正しくヒットしません。
正規表現の
最後になりますが本ブログでは、Python、フロントエンド、PHP、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
正規表現で文字列を扱う際に、改行が含まれる場合は少し考慮が必要です。今日はその対応方法をブログに書きたいと思います。
Pythonの正規表現について
Pythonの正規表現の使い方は、「[Python] 正規表現まとめ」をご参照ください。何がしたいのか
例えば、以下のようなHTMLがあり、そこからaタグを抜き出したいとします。
<div>
<a href="https://www.yoheim.net">
ブログへのリンク
</a>
</div>
見ての通り、HTML全体、そしてaタグにも改行が含まれており、改行を考慮して正規表現にマッチさせる必要があります。下記のように正規表現を書くと、改行を含む箇所が正しくヒットしません。
import re
# html
html = """
<div>
<a href="https://www.yoheim.net">
ブログへのリンク
</a>
</div>
"""
# aタグを取り出したい.
matches = re.findall('(<a.*?</a>)', html)
print(matches) # [] <= 何もヒットしていない
改行が含まれるため、残念ながらヒットしません。改行を含めてマッチさせる
改行を含めてマッチさせるためには、.*?のところを(.|\s)*?に変更します。
import re
# html
html = """
<div>
<a href="https://www.yoheim.net">
ブログへのリンク
</a>
</div>
"""
# aタグを取り出したい.
matches = re.findall('(<a(.|\s)*?</a>)', html)
print(matches)
# [('<a href="https://www.yoheim.net">\n ブログへのリンク\n </a>', ' ')]
そうすると、改行も含めてマッチさせることができました。正規表現の
\sは余白を示す正規表現で改行コードにもマッチします。詳細は「6.2. re — 正規表現操作」を参照ください。最後に
改行を含む文字列に対して正規表現を使うことは、仕事でも時々あるので、ブログにも書きました。知っているとサクッとできて便利です。最後になりますが本ブログでは、Python、フロントエンド、PHP、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!






