-1

2つの文字列変数を一致させようとしていますが、複数の一致をキャッチしたいと思います。re.findallはこのタスクの明白な選択のように見えますが、私が期待するように機能していないようです。次に例を示します。

a = 'a(pp)?le'
b = 'ale, apple, apol'
match = re.findall(a,b)
match
['','pp']

ただし、同じ変数をre.searchに適用すると、文字列内に埋め込まれた正規表現が認識され、最初の一致が取得されます。

match = re.search(a,b)
match.group()
'ale'

このインスタンスでre.findallが機能しない理由を誰かが説明できますか?私は次のことを期待します:

match = re.findall(a,b)
match
['ale','apple']

ありがとう!

4

2 に答える 2

7

キャプチャグループを使用していますが、非キャプチャグループが必要な場合は次のようになります。

a = 'a(?:pp)?le'

正規表現のドキュメント に記載されているように(...)、「キャプチャグループ」が作成され、re.findallの結果は親の中にあるものだけになります。

物事をグループ化するだけの場合(たとえば、を適用する目的で) 、キャプチャしないグループを作成するために?使用します。(?:...)この場合のre.findallの結果は、正規表現全体(または最大のキャプチャグループ)になります。

re.findallドキュメント の重要な部分は次のとおりです。パターンに1つ以上のグループが存在する場合は、グループのリストを返します 。これにより、re.findallとre.searchの結果の違いが説明されます。

于 2013-01-11T17:41:32.523 に答える
1

についてのPythonドキュメントを引用させてくださいre.findall()

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

そして、これはあなたの表現a(pp)?leがすることです。グループ内のコンテンツと一致しますpp。非キャプチャグループを取得することで、グループのこの特別な動作をいつでも無効にできます(?:...)

于 2013-01-11T17:46:28.067 に答える