以下の抜粋では、非捕捉グループ"(?:aaa)"
マッチング結果では無視されるべきである。
結果は次のようになるはずです"_bbb"
。
しかし、"aaa_bbb"
一致する結果が得られます。group(2) を指定した場合のみ、 が表示されます"_bbb"
。
>>> import re
>>> s = "aaa_bbb"
>>> print(re.match(r"(?:aaa)(_bbb)", s).group())
aaa_bbb
ベストアンサー1
「非キャプチャ グループ」の概念を誤解していると思います。非キャプチャ グループに一致したテキストは、依然として全体的な正規表現一致の一部になります。
正規表現(?:aaa)(_bbb)
と 正規表現は両方とも全体の一致(aaa)(_bbb)
を返しますaaa_bbb
。違いは、最初の正規表現には_bbb
一致として を返す 1 つのキャプチャ グループがあるのに対し、2 番目の正規表現には、それぞれ一致として と を返す 2 つのキャプチャ グループがある点ですaaa
。Python_bbb
コードで を取得するには、最初の正規表現で を使用し、2 番目の正規表現で_bbb
を使用する必要があります。group(1)
group(2)
非キャプチャ グループの主な利点は、正規表現内のキャプチャ グループの番号付けを乱すことなく、それらを正規表現に追加できることです。また、正規表現エンジンは非キャプチャ グループに一致するテキストを追跡する必要がないため、パフォーマンスも (わずかに) 向上します。
aaa
正規表現の一致から除外したい場合は、次のようにします。見回す. この場合、肯定的な後読みが役立ちます: (?<=aaa)_bbb
. この正規表現を使用すると、 Python でgroup()
が返されます_bbb
。キャプチャ グループは必要ありません。
正規表現の一致の一部を取得するためにキャプチャ グループを使用できる場合は、lookaround の代わりにその方法を使用することをお勧めします。