RegEx con múltiples grupos?

Me estoy confundiendo al regresar varios grupos en Python. Mi RegEx es este:

lun_q = 'Lun:\s*(\d+\s?)*' 

Y mi cuerda es

 s = '''Lun: 0 1 2 3 295 296 297 298'''` 

Devuelvo un objeto coincidente, y luego quiero ver los grupos, pero todo lo que muestra es el último número (258):

 r.groups() (u'298',) 

¿Por qué no está regresando grupos de 0,1,2,3,4 etc.?

Su expresión regular solo contiene un par de paréntesis (un grupo de captura), por lo que solo obtiene un grupo en su coincidencia. Si utiliza un operador de repetición en un grupo de captura ( + o * ), el grupo se “sobrescribe” cada vez que se repite el grupo, lo que significa que solo se captura la última coincidencia.

En su ejemplo aquí, probablemente esté mejor usando .split() , en combinación con una expresión regular:

 lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)' s = '''Lun: 0 1 2 3 295 296 297 298''' r = re.search(lun_q, s) if r: luns = r.group(1).split() # optionally, also convert luns from strings to integers luns = [int(lun) for lun in luns] 

A veces, es más fácil sin expresiones regulares.

 >>> s = '''Lun: 0 1 2 3 295 296 297 298''' >>> if "Lun: " in s: ... items = s.replace("Lun: ","").split() ... for n in items: ... if n.isdigit(): ... print n ... 0 1 2 3 295 296 297 298 

Otro enfoque sería utilizar la expresión regular que tiene para validar sus datos y luego usar una expresión regular más específica que apunte a cada elemento que desee extraer utilizando un iterador de coincidencia.

 import re s = '''Lun: 0 1 2 3 295 296 297 298''' lun_validate_regex = re.compile(r'Lun:\s*((\d+)(\s\d+)*)') match = lun_validate_regex.match(s) if match: token_regex = re.compile(r"\d{1,3}") match_iterator = token_regex.finditer(match.group(1)) for token_match in match_iterator: #do something brilliant 

Si está buscando una salida como 0,1,2,3,4, etc. La respuesta es muy simple, vea el código a continuación.

print re.findall (‘\ d’, s)