14

私はコードを持っています:

import re
sequence="aabbaa"
rexp=re.compile("(aa|bb)+")
rexp.findall(sequence)

これは['aa']

私たちが持っている場合

import re
sequence="aabbaa"
rexp=re.compile("(aa|cc)+")
rexp.findall(sequence)

我々が得る['aa','aa']

なぜ違いがあり、なぜ(最初に)得られないの['aa','bb','aa']ですか?

ありがとう!

4

4 に答える 4

11

望ましくない振る舞いは、規則的な表現を定式化する方法に帰着します。

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']
于 2012-10-21T16:12:44.873 に答える
10

あなたがしていることを説明させてください:

regex = re.compile("(aa|bb)+")

正規表現を作成して、またはを検索しaa、それ以上またはそれ以降bbがあるかどうかを検索しようとします。正規表現は、検索を続けるか、見つからなくなるまで続けます。キャプチャグループがまたはのみを返すようにしたいので、または最後にキャプチャ/検出されたグループのみを取得します。aabbaabbaabb

ただし、次のような文字列がある場合は、最初に文字列を調べてを見つけ、次にさらに検索して、を見つけるだけでaaxaabbxaa取得できるため、グループは1つになります。次に、別のを見つけますが、次に、を見つけます。それで、停止して、2番目のグループである。を見つけます。次に、別のを見つけます。したがって、最終結果は次のようになります。aa,bb,aaaaxaabbxbbaaaa,bb,aa

これがあなたがしていることを説明することを願っています。そしてそれは期待通りです。の任意のグループを取得するaaか、一致を返す前に複数のグループを探すように正規表現に指示しているbbを削除する必要があります。または+の各一致を正規表現で返すようにします...aabb

したがって、正規表現は次のようになります。

regex = re.compile("(aa|bb)")

乾杯。

于 2012-10-21T16:12:21.210 に答える
0

あなたのパターン

rexp=re.compile("(aa|bb)+")

文字列aabbaa全体に一致します。明確にするためにこれを見てください

>>> re.match(re.compile("(aa|bb)+"),"aabbaa").group(0)
'aabbaa'

また、他の部分文字列は一致しません

>>> re.match(re.compile("(aa|bb)+"),"aabbaa").group(1)
'aa'

したがって、findallは1つの部分文字列のみを返します

>>> re.findall(re.compile("(aa|bb)+"),"aabbaa")
['aa']
>>> 
于 2012-10-21T16:35:46.763 に答える
-1

+を使用する理由がわかりません。これは0または1回の出現を意味し、通常、サブ文字列をオプションで含める文字列を検索する場合に使用されます。

>>> re.findall(r'(aa|bb)', 'aabbaa')
['aa', 'bb', 'aa']

期待どおりに動作します

于 2012-10-21T15:58:42.100 に答える