望ましくない振る舞いは、規則的な表現を定式化する方法に帰着します。
rexp=re.compile("(aa|bb)+")
括弧(aa|bb)はグループを形成します。
そして、findallのドキュメントを見ると、次のことがわかります。
文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、一致するものが見つかった順序で返されます。パターンに
1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の試合は、別の試合の開始に触れない限り、結果に含まれます。**
グループを形成すると、最初に計算されaa、次にbb、次にaa再び計算されます(+数量詞のため)。したがって、このグループは最終的に保持aaされます。そしてfindall、この値をリストに返します(式全体に['aa']一致するものは1つしかないため、リストにはグループに保存されている要素が1つだけ含まれています)。aabbaaaa
あなたが与えたコードから、あなたはこれをやりたいようでした:
>>> rexp=re.compile("(?:aa|bb)+")
>>> rexp.findall(sequence)
['aabbaa']
(?: ...)グループを作成しないためfindall、式全体の一致を返します。
質問の最後に、目的の出力を表示します。aaこれは、またはを探すだけで実現されbbます。数量詞(+または*)は必要ありません。インバーローズの答えにあるようにそれをしてください:
>>> rexp=re.compile("aa|bb")
>>> rexp.findall(sequence)
['aa', 'bb', 'aa']