Webスクレイピングの勉強をしていて、例えば試合結果の得点など数値とハイフンの組み合わせで得点の部分だけを取得したい時がありました。ここで疑問なのはよく見かける電話番号や郵便番号と違い数値の桁数が変動することです。
そして例えばpタグの中には「<span>試合結果は11-5でAチームの勝ちです。</span>」などと数値とハイフン以外の文字列やタグが含まれてしまっていてハイフン前後の数値だけ取るにはどうしたらいいのかなと思った時の備忘録です。
正規表現を使ってハイフンの間の数値だけ取得する方法
Pythonで正規表現を使う手順をみていきます。
数値とハイフンの組み合わせの正規表現を準備
文字列の中からハイフンの間の数値だけを取得するためには正規表現を使う必要があります。
正直よくわかっていないですが、数値を表す「\d」と「-」を組み合わせた以下の正規表現を利用して取得します。おそらく他にもうまく取得できる方法はありますが今回は以下を使用します。
\d+?\d*
ちなみにハイフンも含めて取得したい場合は
\d+-?\d*
のようになります。(実際のサンプルコードは以下にあります。)
正規表現については以下でまとめています。
Pythonで正規表現を取得するためのメソッドfindall()を使う
次に正規表現をPythonでどう使っていくかみていきます。
正規表現をPythonで使うにはreモジュールをimportする必要があります。
import re
正規表現と一致する箇所をすべてリスト型で取得するにはfindall()を使います。実際の使い方を見ると以下のようになります。
import re
text_data ="<span>試合結果は11-5でAチームの勝ちです。</span>"
# ハイフン前後の数値だけ取得
print(re.findall(r'\d+?\d*', text_data)) # ['11', '5']
# ハイフンと前後の数値を取得
print(re.findall(r'\d+-?\d*', text_data)) # ['11-5']
※ 動作確認はpaiza.ioで実施
なんとか取得したい値だけを取ることができました。
おわり
といいつつcolabで実際のスクレイピングデータを使って動作確認すると正規表現は思った通りの結果にならない部分もありましたが、ひとまず取りたい値がとれるようになりました。