3

なぜこの正規表現なのか理解できませんでしたが、

re.findall(r"(do|re|mi)+","mimi rere midore"),

この結果を生成し、

['mi', 're', 're'].

私の期待する結果は['mimi'、'rere'、'midore'] .. ..

ただし、この正規表現を使用すると、

re.findall(r"(?:do|re|mi)+","mimi rere midore"),

期待どおりの結果が生成されます。

2つの正規表現の違いを教えてください。ありがとうございました。

4

1 に答える 1

9

違いはキャプチャグループにあります。キャプチャグループを使用すると、キャプチャされたものだけfindall()が返されます。キャプチャグループがない場合、一致全体が返されます。

最初の例では、グループは、繰り返されるかどうかに関係なく、2つの文字のみをキャプチャします。2番目の例では、一致全体に繰り返しが含まれています。

re.findall()ドキュメントは違いについて非常に明確です:

文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。[…]パターンに1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。

パターンがより大きなパターンの一部であり、繰り返される文字の完全なセットのみを返し(do|re|mi)+たい場合は、2文字のオプションに非キャプチャグループを使用し、全体にキャプチャグループを設定します。findall()

r'Some example text: ((?:do|re|me)+)'
于 2013-03-21T12:06:25.747 に答える