ZapierでAmazonの注文メールから商品リンクを抜き出したいケースがあった。正規表現を使って商品リンクだけ抜き出したかったが、Python Regular Expression というPython特有の正規表現だったので苦戦したのでメモ。
作成した正規表現
(https?://www\.amazon\.co\.jp/gp/r\.html\?[\w.-?/%&=:]+_TE_item_image)
注文メールのHTML本文にはhttps://www.amazon.co.jp/gp/r.html?
で始まるURLが複数ある。そこで最後に_TE_item_image
が付いているURLだけ抽出してやればOKだった。
正規表現を作成する方法
うまく想定したパターンがマッチしなかったり、正規表現ジェネレータなどでもうまくいかないときはVSCodeなどのエディターの検索機能で1個ずつ必要な正規表現を追加していき、マッチ範囲が伸びていくのを確認しながら作成するのがおすすめ。
正規表現検索モードである.*
をオンにし、<td class="name"([\s\w=":(]*)
のように[]*
に正規表現を増やしていく。気になるのは-
の後に>
を持ってくるとマッチしないことだ。ハイフンは特に正規表現での特殊な意味はなかったと思うのだが、詳しい方がいたら教えて欲しく。
<td class="name"([\s\w></.?&%=":(,);-]*)> ([\w\W]*) </a> <br /> ([\W\w]*) <br /> 販売
基本的な正規表現
\ 直後の文字をエスケープ。ただし[]の中ではこれをかかなくても.や?はエスケープされるよう
. 任意の一文字
? 直前の文字もしくはグループが0個か1個。つまりhttpでもマッチするようs?とする
() グループ。これでくくれば1文字として扱われる。(aaa)?は何もないか、aaaになる。
[] 呼び方不明。この角括弧に含まれるいずれか1文字にマッチ
\w [0-9A-Za-z_] と同じ意味。半角英数字とアンダーバーにマッチ
* 直前の文字が 0回以上 繰り返す場合にマッチ
+ 直前の文字が 1回以上 繰り返す場合にマッチ
Zapierの公式ヘルプによると Extract Pattern でテキストを抽出するには()
で囲んでやらねばならない。
In order to have this step return text in its output, you must include a capture group in your regex.
実際のリンク先で最終的にリダイレクトされる商品URLは途中の&T=C&U=
以降にクエリーとして付与されている(ただしhttp://
でSSL化されていない)ようだったので、更に Extract URL の処理をかませて欲しいURLを抽出した。