expresiones regulares: ¿Cómo acceder a varias coincidencias de un grupo?

Estoy armando una expresión regular bastante compleja. Una parte de la expresión coincide con cadenas como ‘+ a’, ‘-57’, etc. A + o a – seguido de cualquier número de letras o números. Quiero hacer coincidir 0 o más cadenas que coinciden con este patrón.

Esta es la expresión que se me ocurrió:

([\+-][a-zA-Z0-9]+)* 

Si tuviera que buscar la cadena ‘-56 + a’ usando este patrón, esperaría obtener dos coincidencias:

+ a y -56

Sin embargo, sólo me devuelven el último partido:

 >>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a') >>> m.groups() ('+a',) 

Mirando los documentos de python veo que:

Si un grupo coincide varias veces, solo se puede acceder a la última coincidencia:

 >>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times. >>> m.group(1) # Returns only the last match. 'c3' 

Entonces, mi pregunta es: ¿cómo acceder a varias coincidencias de grupo?

Suelte el * de su expresión regular (para que coincida exactamente con una instancia de su patrón). Luego use re.findall(...) o re.finditer (vea aquí ) para devolver todas las coincidencias.

Actualizar:

Suena como si estuvieras esencialmente construyendo un analizador de descenso recursivo . Para tareas de análisis relativamente simples, es bastante común y completamente razonable hacerlo a mano. Si está interesado en una solución de biblioteca (por ejemplo, en caso de que su tarea de análisis se vuelva más complicada más adelante), eche un vistazo a los parámetros .

El módulo regex soluciona esto, agregando un método .captures :

 >>> m = regex.match(r"(..)+", "a1b2c3") >>> m.captures(1) ['a1', 'b2', 'c3']