¿Por qué un grupo de captura repetido devuelve estas cadenas?

¿Alguien puede explicar por qué siguiendo las devoluciones ‘cc’?

>>> re.match('(..)+', 'aabbcc').group(1) 'cc' 

Me dijeron que porque ponía cada partido en el grupo (1), entonces el último partido es ‘cc’. ¿Es eso cierto?

Entonces, ¿cómo explicar lo siguiente?

 >>> re.match('(..)+(...)', 'aabbcc').group(1) 'aa' 

Grupo de captura repetida: el número de grupo permanece igual

El grupo definido por (..) es el Grupo 1. El cuantificador + repite. Cada vez que el motor puede repetir el grupo (haciendo coincidir dos caracteres), el Grupo 1 se sobrescribe.

  • Cuando el motor comienza a coincidir, captura aa al Grupo 1
  • Luego captura bb al grupo 1
  • Luego captura cc al Grupo 1.

Cuando inspeccionas el Grupo 1, el motor retorna cc . Todas las demás capturas se pierden.

(La excepción es el motor .NET, que también devuelve cc pero también le permite inspeccionar capturas intermedias gracias al objeto CaptureCollection. Contendría aa , bb y cc ).

Con (..)+(...) , ¿Por qué el Grupo 1 contiene aa ? Retroceso!

Para entender esto, nuevamente debemos seguir la ruta del motor de expresiones regulares.

  • Una vez más, cuando el motor comienza a coincidir, captura aa en el Grupo 1
  • De nuevo, repite el grupo (..) y captura bb al Grupo 1
  • De nuevo, repite el grupo (..) y captura cc en el Grupo 1
  • El motor ahora intenta hacer coincidir (...) . Falla: no quedan caracteres para consumir.
  • El motor retrocede tanto en la cadena como en el patrón de expresiones regulares. El + significa una o más veces, y lo combinamos .. tres veces, por lo que podemos renunciar a una, o incluso a dos. En esta etapa, el motor abandona la última coincidencia del grupo cuantificado (..)+ , que es cc . Volvemos a cuando Grupo 1 era bb .
  • El motor intenta hacer coincidir (...) nuevo. Solo quedan dos caracteres: cc , por lo que vuelve a fallar.
  • El motor retrocede al renunciar a la última coincidencia del grupo cuantificado (..)+ , que es bb . En esta etapa, el Grupo 1 es aa nuevo.
  • El motor intenta hacer coincidir (...) nuevo. Tiene éxito: el Grupo 2 es bbc , y el Grupo 1 es aa

Referencia

  • Nombre y numeración de grupo de captura: los detalles sangrientos
  • Referencias