2012-02-19 8 views
5

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 
+0

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

+0

@danielkza, pero ¿por qué 'groups()' me dio ''-l m'' not ''-j k''? – Alcott

+1

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

Respuesta

11

groups() sólo devuelve ningún grupo capturados de forma explícita en su expresión regular (denotado por ( redondas soportes ) en su expresión regular), mientras que group(0) retornos toda la subcadena que coincide con su expresión regular, independientemente de si su expresión tiene algún grupo de captura.

En su lugar, la primera captura explícita en su expresión regular se indica con group(1).

Re seguimiento de edición:

¿Por qué no search dame todas las subcadenas?

search() solo devolverá la primera coincidencia con el patrón en la cadena de entrada.

+0

Publicación original de la publicación. – Alcott

+0

@Alcott: agregué una respuesta de seguimiento. – BoltClock

+0

Hehe. "entre paréntesis". –

1

Su expresión regular no tiene grupos de coincidencias, indicadas por pares ((...)).

2

Me explico con un ejemplo pequeño

>>> var2 = "Welcome 44 72" 
>>> match = re.search(r'Welcome (\d+) (\d+)',var2) 
>>> match.groups() 
('44', '72') 
>>> match.groups(0) 
('44', '72') 
>>> match.groups(1) 
('44', '72') 
>>> match.group(0) 
'Welcome 44 72' 
>>> match.group(1) 
'44' 

Explicación: groups() es un tipo tupla que tiene todos los valores que son el patrón coincide con la expresión regular.

groups(0) o groups() o groups(1) .... sólo muestra todos los valores

grupo() o grupo (0) -> Se le dará toda la cadena junto con el valor que es el patrón coincide con la expresión regular .

grupo (1) dará primero patrón de valores emparejados

grupo (2) dará segundo patrón de valores emparejados ....

Cuestiones relacionadas