5

記号の後+または次のような文字列の先頭にあるすべての文字を抽出する必要があります。

formula = "X+BC+DAF"

+私はそうしようとしました、そして私は結果のサインを見たくありません。だけ見たい['X', 'B', 'D']です。

>>> re.findall("^[A-Z]|[+][A-Z]", formula)
['X', '+B', '+D']

括弧でグループ化すると、次の奇妙な結果が得られました。

re.findall("^([A-Z])|[+]([A-Z])", formula)
[('X', ''), ('', 'B'), ('', 'D')]

グループ化しようとすると、なぜタプルが作成されたのですか?それが戻るように正規表現を直接書く方法は['X', 'B', 'D']

4

1 に答える 1

7

正規表現にキャプチャグループがある場合はre.findall、グループによってキャプチャされた値のみを返します。グループがない場合は、一致した文字列全体が返されます。

re.findall(pattern, string, flags=0)

文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、一致するものが見つかった順序で返されます。パターンに1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の試合は、別の試合の開始に触れない限り、結果に含まれます。


['X'、'B'、'D']を返すように正規表現を直接記述する方法は?

キャプチャグループを使用する代わりに、非キャプチャグループを使用できます。

>>> re.findall(r"(?:^|\+)([A-Z])", formula)
['X', 'B', 'D']

または、この特定のケースでは、単語の境界を使用してより簡単な解決策を試すことができます。

>>> re.findall(r"\b[A-Z]", formula)
['X', 'B', 'D']

str.splitまたは、正規表現を使用しないを使用するソリューション:

>>> [s[0] for s in formula.split('+')]
['X', 'B', 'D']
于 2012-12-12T13:29:55.620 に答える