[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をフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!