Creo que está malinterpretando el concepto de "grupo no captor". El texto que coincide con un grupo que no captura se convierte en parte de la concordancia de expresión regular global.
Tanto la regex (?:aaa)(_bbb)
como la regex (aaa)(_bbb)
devuelven aaa_bbb
como la coincidencia general. La diferencia es que la primera expresión regular tiene un grupo de captura que devuelve _bbb
como coincidencia, mientras que la segunda expresión regular tiene dos grupos de captura que devuelven aaa
y _bbb
como sus respectivas coincidencias. En su código de Python, para obtener _bbb
, debe usar group(1)
con la primera expresión regular, y group(2)
con la segunda expresión regular.
El principal beneficio de los grupos que no capturan es que puede agregarlos a una expresión regular sin alterar la numeración de los grupos de captura en la expresión regular. También ofrecen un rendimiento (ligeramente) mejor ya que el motor de expresiones regulares no tiene que realizar un seguimiento del texto que coinciden con los grupos que no capturan.
Si realmente desea excluir aaa
de la coincidencia total de expresiones regulares, entonces necesita usar lookaround. En este caso, el truco positivo es el truco: (?<=aaa)_bbb
. Con esta expresión regular, group()
devuelve _bbb
en Python. No se necesitan grupos de captura.
Mi recomendación es que si tiene la capacidad de utilizar grupos de captura para obtener parte de la coincidencia de expresiones regulares, utilice ese método en lugar de mirar hacia atrás.
genial, gracias por la edición y respuestas que señalan el concepto de grupo no captor –