aquí está:¿Cuál es la diferencia entre grupos y grupos en el módulo re?
import re
>>>s = 'abc -j k -l m'
>>>m = re.search('-\w+ \w+', s)
>>>m.groups()
()
>>> m.group(0)
'-j k'
Por qué groups()
me da nada, pero group(0)
produce alguna? ¿Cuál es la diferencia?
Seguimiento Código
es el siguiente
>>>re.findall('(-\w+ \w+)', s)
['-j k', '-l m', '-n o']
findall
puede conseguirme todas las subcadenas -\w+ \w+
, pero mira esto:
>>>m = re.search('(-\w+ \w+)+', s)
>>>m.groups()
('-j k',)
¿Por qué no dar search
yo todas las subcadenas?
Seguimiento Una vez más
Si s = 'abc -j k -l m -k o
, y
>>>m = re.search(r'(-\w+ \w+)+', s)
>>>m.groups()
('-l m ',) # why just one substring?
>>>m.group(0)
'-j k -l m ' # as I expected
El comportamiento estándar en la mayoría de los sabores de expresiones regulares es * reemplazar * cualquier contenido de un grupo cuando se captura más de una vez en lugar de generar grupos adicionales para cada pase. Si quiere capturarlos a todos, tendrá que buscar repetidamente. 're.findall()' debería ser útil en su caso. – danielkza
@danielkza, pero ¿por qué 'groups()' me dio ''-l m'' not ''-j k''? – Alcott
El primer pase de la repetición coincide con '-j k'. El segundo pase sobrescribió la coincidencia almacenada con una nueva, '-l m'. Si hubiera incluso más coincidencias, la última sería la guardada. No podría decirte * por qué * existe este comportamiento, pero está presente en prácticamente todos los sabores de expresiones regulares. Si desea capturar todas las coincidencias, debe aplicar el patrón varias veces. – danielkza