Pythonの正規表現でグループ(検索結果の一部)を取得

Created 2018年6月18日15:22
Updated 2018年6月20日13:19
Categories Python

Pythonで正規表現のグループ取得方法を毎回忘れるのでメモ。

環境

  • Windows 10 Pro 1803 64bit
  • Python 3.6.5

目的

ニコニコ動画のURLから動画IDを取り出すことを考えます。

例えば、http://www.nicovideo.jp/watch/sm26106724?...のようなURLから、sm26106724だけ取り出すことが目的です。

取得方法

今回は文字列の検索なので、re.searchメソッドを使用します。

第一引数に検索する正規表現、第二引数に検索対象の文字列を渡します。

正規表現は今回の場合nicovideo.jp/watch/([a-z0-9]*)としています。動画URLに続いてアルファベットか数字を示す[a-z0-9]が0回以上続くものを検索対象としてグループ化している感じですね。

>>> import re
>>> re.search("nicovideo.jp/watch/([a-z0-9]*)", "http://www.nicovideo.jp/watch/sm26106724?...")
<_sre.SRE_Match object; span=(11, 40), match='nicovideo.jp/watch/sm26106724'>

見つかった場合、matchオブジェクトが返されます。

見つからないとNoneが帰りますので、ここで一旦エラー処理を行った方が安全です。

matchオブジェクトを見てみましょう。

>>> matched = re.search("nicovideo.jp/watch/([a-z0-9]*)", "http://www.nicovideo.jp/watch/sm26106724?...")
>>> matched.group()
'nicovideo.jp/watch/sm26106724'

正規表現で一致した部分が取得できました。

最後に、グループ化してある動画IDだけ抽出してみます。

>>> matched.groups()
('sm26106724',)
>>> matched.groups()[0]
'sm26106724'

無事に動画IDが取得できました。マッチしたものが複数ある場合はタプルの内容が増えるので扱いが変わってきそうです。

また、searchした段階でNoneが帰ってなければ値は1つ以上あるはずなので、インデックスに0を指定する行為はたぶん危険ではないはずです(間違っていたらごめんなさい・・・)。

検索するとre.compileする例が多いですが、複数回使わないなら直接re.searchしても良い気がします。

参考

所感

仕方ない事かもしれませんが、re.searchでNoneが返ってくる仕様は少し扱いづらいですね。

コメントを投稿

コメント