Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

正規表現の問題で「IndexError: no such group」というエラーが出てきます。このエラーの意味を教えてください。

f:id:kenken0326:20201021112349p:plain

こんにちは。PyQサポートです。
今回は正規表現でダブルクォーテーションの間だけ取得しようとした時に出てきたIndexError: no such groupというエラーの意味と考えられる原因を紹介します。

「IndexError: no such group」というエラーのお悩み

正規表現でダブルクォーテーションの言葉を取り出そうとした時IndexError: no such groupというエラーが出ました。 ""で囲んでいるのになぜ思っている通りに取り出されないのか分からないので教えてください。

書いたコード

import re

content = 'You say, "I like programming." and "My dream is to be an Engineer.".'
m = re.search('"(.*)"', content)
print(m.group(1))
print(m.group(2))

m.group(2)を追加した時の実行結果

I like programming.
Traceback (most recent call last):
  File "re2.py", line 8, in <module>
    print(m.group(2))
IndexError: no such group

m.group(1)だけの時の実行結果

I like programming." and "My dream is to be an Engineer.

IndexError: no such groupの意味

IndexError: no such groupは、「そのようなグループはありません」という意味のエラーです。
groupメソッドで"(.*)"を使うとダブルクォーテーションで囲まれた部分を探すので、m.group(1)I like programming." and "My dream is to be an Engineer.になります。

以下にgroupメソッドと検索対象の正規表現"(.*)"について解説します。

途中にダブルクォーテーションで閉じられていても、最後のダブルクォーテーションの手前までマッチします。

質問のコードはm.group(2)に該当する文字列が存在しないためエラーとなっています。

解説

正規表現はreモジュールを使うと特定のパターンを探し出せます。 パターンに括弧が含まれていると、括弧内の文字列にマッチした部分はグループ(キャプチャともいいます)になります。

groupメソッドgroup()を使うと、対象文字列でマッチした部分が実行されます。

正規表現"(.*)"の解説

  • .任意の1文字
  • .*任意の1文字の0回以上の繰り返し
  • (.*) グループ化
  • "(.*)" 任意の文字が""に挟まれている

これを踏まえて、実行結果を見てみましょう。

  • m.group(0):"I like programming." and "My dream is to be an Engineer."
  • m.group(1):I like programming." and "My dream is to be an Engineer.
  • m.group(2):"(.*)"と設定しているのに""で囲まれた文字列が1つしかマッチしていないので、エラーになっています。

""(特定の記号)で囲まれた文言を正規表現でマッチングさせるには?

特定の記号で挟まれた複数の文言をそれぞれマッチさせる方法(今回の例では、m.group(1)m.group(2)I like programming. My dream is to be an Engineer.を別々に取得する方法)は、こちらの記事で紹介しています。

blog.pyq.jp

Copyright ©2017-2020 BeProud Inc. All rights reserved.