1

Pythonのドキュメントでは、例を参照してください:

m = re.match("([abc])+", "abc")
m.groups() # ('c',)

それはどのように起こりますか?サブグループは「a」であるべきだと思いました。

4

2 に答える 2

3

振る舞いは不特定だと思います。繰り返し演算子内でキャプチャグループを使用すると、通常、最後の一致がキャプチャされます。ただし、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']

ここでは、シーケンス全体が単一のグループとしてキャプチャされてから分割されます。

于 2013-02-19T06:38:13.830 に答える
2
>>> 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 要素のタプルを取得します。

于 2013-02-19T06:32:07.247 に答える