もっと便利な道具

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

group(0) は当たった全体

番号 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

groups() でまとめて受け取る

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 にグループがあるとタプルになる

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 まで書いておくと、見つからなかったことが画面から分かるので親切だよ。次のレッスンでは、探すだけでなく書きかえることをやろう。