>>> re.findall(r"(?:do|re|mi)+", "mimi")
['mimi']
>>> re.findall(r"(do|re|mi)+", "mimi")
['mi']
定義の私の理解によれば、同じ答えが得られるはずです。との唯一の違いは(...)
、(?:...)
後で後方参照を使用できるかどうかです。何か不足していますか?
(...)
括弧内の正規表現に一致し、グループの開始と終了を示します。グループの内容は、一致が実行された後に取得でき、後で説明する \number 特殊シーケンスを使用して文字列内で一致させることができます。リテラル '(' または ')' と一致させるには、( または ) を使用するか、文字クラス [(] [)] で囲みます。
(?:...)
通常の括弧の非キャプチャ バージョン。括弧内の正規表現に一致しますが、グループに一致した部分文字列は、一致の実行後に取得したり、パターン内で後で参照したりできません。