正規表現の「非キャプチャ」グループが機能しないのはなぜですか? 質問する

正規表現の「非キャプチャ」グループが機能しないのはなぜですか? 質問する

以下の抜粋では、非捕捉グループ"(?: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 の代わりにその方法を使用することをお勧めします。

おすすめ記事