Pythonお悩み解決とは?
オンライン学習サービス「PyQ」のサービスの一つ、学習サポートに寄せられた質問の中から PyQユーザーだけでなく、学習者みなさんに役立つプログラミング言語Python一般に関する質問を選んでご紹介し、解説するコーナーです。
プログラミング学習者の目線から見たつまづきを解決していくよう、現役プログラマーのサポートチームがお答えします。
質問内容
PyQには「正規表現」を学ぶ課題があります。
こちらの問題に関するご質問をいただきました。
re.matchの中に、
'[^、]*、([^、]*)、(\d+)円$'
とありますが、この意味は何でしょうか? また2つ目の[^、]*
が括弧で囲まれている理由は何でしょうか?
問題の模範回答(一部抜粋)
import re (略) m = re.match('[^、]*、([^、]*)、(\d+)円$', shop) if m: item_name = m.group(1) item_price = m.group(2) if int(item_price) >= 2800: print('{} {}円'.format(item_name, item_price))
問題文の正規表現の意味
模範回答では、変数shopに代入されている文字列が正規表現 '[^、]*、([^、]*)、(\d+)円$'
とマッチするか判定しています。
この正規表現の意味を一つずつ解説していきます。
1. 「[^、]*、」の正規表現の意味
[^、]*、
この部分は 、
以外の0文字以上の文字と文字 、
を表します。
「[^、]*、」 に出てくる正規表現の記号の解説
[]
:「集合」を表します。[^]
とすると、あとに続く条件の補集合を取り「集合に含まれない」という意味になります。[^、]
:上記から、「、
以外の文字」という意味になります。
*
: 前の条件を受けて、「0文字以上の文字」を表します。$
:「文字列の最後」という意味です。なので、円$
は、文字列の最後の直前が文字円
という意味です。
2. 「 ([^、]*)、」の正規表現の意味
([^、]*)、
この部分も 、
以外の0文字以上の文字と文字 、
を表します。1と違ってカッコで括られている意味は、下で解説します。
3. 「(\d+)円$」の正規表現の意味
(\d+)円$
この部分は 1桁以上の数値
+ 円
で終了するということをを表します。
「(\d+)円$」 に出てくる正規表現の記号の解説
\d
:「0〜9までのどれかの数値」を表しますので、言い換えると 1桁の数値 という意味です。+
: 前の条件を受けて、「1文字以上の文字」を表します。$
:「文字列の最後」という意味です。なので、円$
は、文字列の最後の直前が文字円
という意味です。
正規表現の中のカッコ("()")の意味
正規表現中で ()
で囲んだ部分はメソッド group
で取り出せます。
- m.group(0)は、マッチした全体の文字列
- m.group(1)は、1つ目のカッコの部分
- m.group(2)は、2つ目のカッコの部分
模範解答10行目のfor文の1番目の文字列 駅弁高松堂、米澤豚一番育ち豚どん、950円
を例に解説します。
- m.group(0)は、全体の文字 →
駅弁高松堂、米澤豚一番育ち豚どん、950円
- m.group(1)は、1つ目のカッコの部分 →
米澤豚一番育ち豚どん
- m.group(2)は、2つ目のカッコの部分 →
950
m.group(0)が'阿部亭'(一番目の要素のみ)ではなく、'阿部亭、かしわ弁当、780円'となるのは何故でしょうか?
groupメソッドの決まりで、 0
の場合は、マッチした文字列全体と決まっています。
正規表現をもっと詳しく
更に詳しくは、公式ドキュメントを参照ください
re — 正規表現操作