Pythonのドキュメントでは、例を参照してください:
m = re.match("([abc])+", "abc")
m.groups() # ('c',)
それはどのように起こりますか?サブグループは「a」であるべきだと思いました。
振る舞いは不特定だと思います。繰り返し演算子内でキャプチャグループを使用すると、通常、最後の一致がキャプチャされます。ただし、Python Issue 7132での議論は、これが常に当てはまるとは限らないことを示唆しています。
はい。ただし、これはグループインデックスの完全な整合性のために必要です。現在の戻り値は明らかに矛盾しています(通常、キャプチャグループの最後の発生を返しますが、バックトラック後に返される一致のため、これが常に当てはまるとは限らないことを発見しました...)
ただし、すべての文字を返すように例を変更するのは簡単です。
In [7]: m = re.match("([abc]+)", "abc") # a slightly different regex
In [8]: list(m.groups()[0])
Out[8]: ['a', 'b', 'c']
ここでは、シーケンス全体が単一のグループとしてキャプチャされてから分割されます。
>>> m = re.match("([abc])+", "abc")
>>> m.group(0)
'abc'
>>> m.group(1)
'c'
>>> m.groups()
('c',)
正規表現([abc])+
は文字列全体と一致します ( を参照m.group(0)
)。
この一致は、1 つの文字[abc]
をキャプチャし、結果をグループ番号 1 にキャプチャしてから、プロセスを繰り返すことによって得られます。したがって、そのグループは最初に になりa
、次に (次の繰り返しで)b
になり、最後に になりc
ます。
.groups()
すべてのキャプチャ グループの一致のタプルを返します。キャプチャ グループは 1 つしかないため、1 要素のタプルを取得します。