01 / 06
見つけるだけでは足りない
前のレッスンで 03-1234 という電話番号を見つけられるようになった。でも、ほしいのはたいていその先だよね。
- 市外局番だけがほしい
- 日付を年・月・日に分けたい
- 名前と個数を別々に受け取りたい
見つけた部分をさらに分けて取り出すしくみが、この回の話だよ。
もっと便利な道具
INPUT · スライド
01 / 06
前のレッスンで 03-1234 という電話番号を見つけられるようになった。でも、ほしいのはたいていその先だよね。
見つけた部分をさらに分けて取り出すしくみが、この回の話だよ。
02 / 06
形の中で取り出したいところを ( ) で囲む。それだけだよ。
囲んだところは グループ と呼ばれて、group(1) group(2) と番号で受け取れる。番号は開きかっこが出てくる順に1から振られるよ。
import rem = re.search(r"(\d+)-(\d+)", "でんわ 03-1234")if m: print(m.group(1)) print(m.group(2))実行結果
03 1234
03 / 06
番号 0 は特別で、かっこに関係なく当たった部分ぜんたいを指すよ。
前のレッスンで書いていた group() は、実は group(0) の省略形だったんだ。だから引数なしでも全体が返ってきていたんだね。
import rem = re.search(r"(\d+)-(\d+)", "でんわ 03-1234")if m: print(m.group(0)) print(m.group())実行結果
03-1234 03-1234
04 / 06
group(1) group(2) group(3) と何度も書くのは面倒だね。groups() なら、かっこの中身をまとめてタプルで返してくれるよ。
タプルなので、第2章でやった分けて受け取る書きかたがそのまま使える。tosi, tuki, hi = m.groups() の形だね。
import rem = re.search(r"(\d+)-(\d+)-(\d+)", "2026-09-14")if m: print(m.groups()) tosi, tuki, hi = m.groups() print(f"{tosi}ねん{tuki}がつ{hi}にち")実行結果
('2026', '09', '14')
2026ねん09がつ14にち05 / 06
findall にかっこ入りの形を渡すと、返ってくるのがタプルのリストに変わるよ。
1件ずつの中身がさらに分かれているので、for namae, kazu in ... の形でそのまま回せる。集めると分けるを一度にやる書きかただね。
import reprint(re.findall(r"(\d+)-(\d+)", "03-1234 06-5678"))実行結果
[('03', '1234'), ('06', '5678')]06 / 06
グループを使っても、見つからなければ None なのは同じだよ。
m.group(1) は m.group() よりもさらに奥を触る書きかただから、if m: を忘れるとやっぱり AttributeError で落ちる。
m = re.search(r"(\d+)-(\d+)", moji)if m: print(m.group(1))else: print("みつからなかった")else まで書いておくと、見つからなかったことが画面から分かるので親切だよ。次のレッスンでは、探すだけでなく書きかえることをやろう。