1
0

More than 1 year has passed since last update.

re.error: nothing to repeat at position … ってなんだ?

Last updated at Posted at 2023-02-03

Pythonなどでコーディングしていると、以下のようなエラーに遭遇することがあります。

re.error: nothing to repeat at position

あとは0とか13とかいろんな数値が検索時の質問例に出てきますが、これに対してあまり有効な回答がなかったので、ズバリ答えを書いておきます。

回答

正規表現の繰り返し記号の部分を見直しましょう。また、positionは正規表現内Regex(reはRegexのこと)記述部分の文字列位置で、0だと0文字目、13だと13文字目です。

※マッチング対象の文字列ではなくて、Regexでの文字列位置なので注意。

実例1

例を見ていきます。例では加算の式から序数を抽出しています。

test1err.py
 val = re.sub(r'(+?)(\d+)(.*)',r'序数:\2',val)

?は後で詳しく説明しますが、0回か1回の繰り返しを判定するマッチング記号なので、値(グループ)の存在有無を判定する場合によく用いられます。これを確認すると+記号が0文字か1文字で判定しているようですが、+という記号はマッチング記号(1文字以上の繰り返し)とも被ってしまうので、その結果存在しない文字の繰り返しを指定することになり、以下の警告が出ます。

nothing to repeat

つまり、繰り返したい文字が存在しないという意味です。繰り返し記号と重なる記号をマッチングさせたりする場合は必ずエスケープしておきましょう。

test1.py
 val = re.sub(r'(\+?)(\d+)(.*)',r'序数:\2',val)

実例2

次のようにパスを認証したい場合でも出現します。一見?no=9999(9999は任意の番号)に紐づくパスクエリを確認しているようですが…

test2err.py
re.match(r'(.+)(?no=)(\d+)',path)

説明した通り、?はエスケープが必要なので、以下のように修正します。

test2.py
re.match(r'(.+)(\?no=)(\d+)',path)

エラー出現の条件

繰り返し記号なので、以下のマッチング記号と重なる記号をマッチングさせた場合に、エスケープ処理を怠ると出現します。

  • ? 0回か1回
  • + 1回以上
  • * 0回以上
  • {n} {n,} {n,m} 繰り返し回数の指定

類似のエラーメッセージ

re.errorと書いているのがヒントで、これはRegex上のエラーを意味します。positionは文字列の順番です。また、Regexにおいて、グループ化記号()は最初に評価されます。なので、このグループ化が不適切な場合は直下に例示するエラー(unbalanced…)が出現し、このグループ化が適切でマッチング記号パターンが不適切の場合は他のエラーが出現することになります。

unbalanced parenthesis at position

parenthesisとは括弧のことで、()のグループ化が不適切だった場合に出現します。( )のグループ化がきちんとできているか確認しましょう。

unterminated character set at position

終了をしていない文字列という意味なので、エスケープせずにRegex上で意味を持っている左括弧(例でいえば([{など)を繰り返し回数にかけたりすると出現します。ただし、右括弧()]})だけの場合は、記述の位置によって普通に処理できたりもします。

invalid group reference 3 at position

不正なグループという意味で、エスケープしていない文字列(&、\など)に対して、繰り返し記号などを指定した場合に出現します。ちなみにシングルクォートやダブルクォートでエスケープ処理を怠ると、Syntax error(Syntaxとは構文のこと)が発生し、サーバー自体止まってしまいます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0