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']