1
>>> re.findall(r"(?:do|re|mi)+", "mimi")
['mimi']
>>> re.findall(r"(do|re|mi)+", "mimi")
['mi']

定義の私の理解によれば、同じ答えが得られるはずです。との唯一の違いは(...)(?:...)後で後方参照を使用できるかどうかです。何か不足していますか?

(...)

括弧内の正規表現に一致し、グループの開始と終了を示します。グループの内容は、一致が実行された後に取得でき、後で説明する \number 特殊シーケンスを使用して文字列内で一致させることができます。リテラル '(' または ')' と一致させるには、( または ) を使用するか、文字クラス [(] [)] で囲みます。

(?:...)

通常の括弧の非キャプチャ バージョン。括弧内の正規表現に一致しますが、グループに一致した部分文字列は、一致の実行後に取得したり、パターン内で後で参照したりできません。

4

3 に答える 3

4

(?:...)グループ化を行いません。だから、

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

正規表現全体の各一致に対して 1 つの値を返します。この場合はmi文字列の 2 倍なので、1 つの要素を持つリストmimi.

(...)グループ化を行い、findall()一致した括弧で囲まれた各文字列の値を返します。の

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

一致miしてグループ 1 として保存し、続けて再び一致しmiますが、同じ括弧で囲まれた文字列内にあるため、グループ 1 を上書きし、最後にグループ 1 の値を返しますmi

于 2013-10-20T21:58:00.970 に答える