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