17/05/05

python正規表現入門4「グルーピングと後方参照」



 

今回はグルーピングと後方参照を行なっていきます。
<a href="http://google.com">http://google.com</a>
からキャプチャしたものを利用したり、簡単なurlのチェックなどを行います

 

前回までの記事
python正規表現入門「日付を取得する」
python正規表現入門2「文字列の取得」
python正規表現入門3「先読み、後読みの、肯定と否定」

 

こちらのサイトで実行していきます。
右にある旗マークを押して、globalを有効にしてください。
Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript

キャプチャする

以前にも行いましたが、() を使うとキャプチャすることができます。

# 正規表現
<a href=\"(.+?)\">(.+?)<\/a>

後方参照

aタグを見てみると、hrefの中身と、テキスト部分が一致しています。
なので、hrefの中身をキャプチャし、正規表現内で利用したいと思います。
これを後方参照と言います。

# 正規表現
<a href=\"(.+?)\">\1<\/a>

\1 は () でキャプチャされた1番目文字列を表しています。

グルーピング

次にテキスト

<a href="https://www.google.co.jp">https://www.google.co.jp</a>
<a href="https://www.google.net">https://www.google.co.jp</a>

を追加します。
この中からルートドメインが jp もしくは com を持つurlであればマッチする
正規表現を実現して見ます。

 

実は () にはキャプチャ以外に、グルーピングという効用があります。
() の中に含まれた表現はグループ化され、グループの中身を 、+、 ?、{m,n}
のように繰り返し利用することができます。
例えば (ab)
は abの0回以上の繰り返しにマッチします

 

 

上記でわかる様に() と [] で挙動は異なります。

 

これを用いてルートドメインがcomまたはjpになる
テキストを取得してみます。

# 正規表現
href=\".*?(jp|com)\"

後方参照を行わない

ここではルートドキュメントがcomまたはjpになる
テキストがあるのかどうかを知るためなので、
キャプチャする必要はありません。

こういう場合は(?:…)を利用します。

# 正規表現
href=\".*?(?:jp|com)\"

 

終わりです。

 

参考記事
正規表現 HOWTO — Python 3.6.1 ドキュメント

スポンサーリンク

メールアドレスが公開されることはありません。

youya66

だらけとびびり、それとちょっぴりのてきとーさ。

コアラになってだらだらしながら愛されたい。