正規表現の勉強をしています。
そこで以下のコードを書いて実行しました。
import re content = '"You say", "Yes, I am.".' m = re.search('"(.*)"', content) print(m.group(0)) print(m.group(1))
結果はこちら
"You say", "Yes, I am." You say", "Yes, I am.
とりあえず指示にしたがって入力してみましたが、以下のことが疑問になってしまいました。
①'"(.*)"'の()は必要なのか?
()に対し何も説明がなく、参考書をみてみたのですが、当たり前のように使っていました。確かに除くとエラーがでるので、必要だとは思うのですが。色々調べてグループ化の()と思うのですが、グループ化しなくても.*だけで任意の文字列を表しているので、()は必要ないのではと思いました。
②m.groupについてですが、これは検索結果の文字列を返すのですが、()の中の指定した数字で何が表示されるのかがいまいち理解できていません。
(0)はマッチした文字列全体と学んでいたので''で囲まれた文字列が(0)で表示されるのはわかります。
(1)では1番目のグループ(最初の括弧内)が表示されると学んだので、はじめの"と最後の"で囲まれた文字列You say", "Yes, I am.が表示されるのもわかります。
しかし、(2)だと次はsayの後の"と、Yesの前の"の文字列", "の中身が表示されるのかと思ったらエラーが出てしまいました。
"You say", "Yes, I am." You say", "Yes, I am. Traceback (most recent call last): File "re2.py", line 8, in <module> print(m.group(2)) IndexError: no such group
さらに、いろんなサイトをあさって勉強していたのですが、
そこで他のサイト(https://qiita.com/kaeruair/items/747518c116c85a88ee21)で以下のものを見つけました。
import re m = re.search(r"([a-z]+)\s*=\s*([0-9]+)", "index = 123") if m: print(m.group(0)) # -> "index = 123" print(m.group(1)) # -> "index" print(m.group(2)) # -> "123"
(0)は文字列全体を表示するのはわかりますが、なぜ(1)がindex、(2)が123を表示するのかがわかりません。
文字列には""が一つしかなく、先ほどの(n)ではn番目のグループ(n番目の括弧)を表示するという理解では矛盾してしまいます。
つまり(1)も(2)も存在しないのではと思いました。
以上のような矛盾が生じていて、自分のgroup()の理解が間違っていると思うのですが、その辺を中心に詳しく教えていただけたら幸いです。長文失礼しました。よろしくお願いします。
mac 10.14.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/06 05:30
2019/02/06 05:31
2019/02/06 05:34
2019/02/06 10:42