17/05/05

python正規表現入門3「先読み、後読みの、肯定と否定」



 

今回は
<html class=”hoge” id=”fuga”>barbar</html>
からクラス名のみを、先読み、後読みといったテクニックを使いながら
取得していきます。

 

前回までの記事
python正規表現入門「日付を取得する」
python正規表現入門2「文字列の取得」

肯定の後読み

まずは、クラス名を取得してみましょう。

import re;
reg = "class=\"(.*?)\"";
text = "<html class=\"hoge\" id=\"fuga\">barbar</html>";

result = re.search(reg, text);
# result.group(1) -> hoge;

これを後読みといったテクニックを用いて同じ結果になるような
正規表現を実現していきます。

import re;
reg = "(?<=class=)\"(.*?)\"";
text = "<html id=\"fuga\" class=\"hoge\">barbar</html>";

result = re.search(reg, text);
# result.group(1) -> hoge;

(?<=…)は次に続くものとマッチすればマッチします。
ここでは class= の次に ”(.*?)” があればそれにマッチするといった
正規表現になります。

肯定の先読み

先ほどは肯定の後読みを行いましたが、今回は肯定の先読みで
クラス名を取得したいと思います。

import re;
reg = "class=\"(.*?)\"(?=)>";
text = "<html id=\"fuga\" class=\"hoge\">barbar</html>";

result = re.search(reg, text);
# result.group(1) -> hoge;

(?=…) は前に続くものとマッチすればマッチします。
ここでは > の前が class=\”(.*?)\”であればマッチするといった
正規表現になります。

否定の後読み

次にクラス名を取得するのに否定の後読みを用いたいと思います。
今回はhtmlタグの中はclassとidで構成されているので、
idではなかったら取得
のように正規表現を書けば良さそうです。

import re;
reg = "(?<!id)=\"(.*)?\"";
text = "<html id=\"fuga\" class=\"hoge\">barbar</html>";

result = re.search(reg, text);
# result.group(1) -> hoge;

(?<!…) は…ではない場合に、次に続くものとマッチすればマッチします。
ここでは id ではない文字列の後ろが =\”(.*)?\” であればマッチするといった
正規表現になります。

否定の先読み

否定の先読みとは

Isaac(?!Asimov) は、 “Isaac” に “Asimov” が続かない場合のみマッチします。
参考記事 6.2. re — 正規表現操作 — Python 3.6.1 ドキュメント

この例ではIsaacの次にAsimovがないといった正規表現になります。

import re;
reg = "\s(?!id=\".*?\").*?=\"(.*?)\"";
text = "<html id=\"fuga\" class=\"hoge\">barbar</html>";

result = re.search(reg, text);
# result.group(1) -> hoge;

(?!…) は直前の正規表現の次に…がマッチしなければマッチします。
上記は少しややこしいですが、
\s(空白)の後が id=”.?” でなければ .?=“(.*?)” が解釈される
正規表現になります。

 

終わりです。

 

参考記事
初心者歓迎!手と目で覚える正規表現入門・その4(最終回)「中級者テクニックをマスターしよう」 – Qiita

スポンサーリンク

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

youya66

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

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