2010-04-24 7 views
23

En el siguiente fragmento, el grupo no captivo "(?:aaa)" debe ignorarse en el resultado coincidente, , por lo que el resultado debe ser "_bbb" solamente.
Sin embargo, obtengo "aaa_bbb" en el resultado coincidente; solo cuando especifico el grupo (2) muestra "_bbb".Por qué el grupo "no capturable" de expresiones regulares no funciona

import re 

string1 = "aaa_bbb" 
print(re.match(r"(?:aaa)(_bbb)", string1).group()) 

>>> aaa_bbb 
+1

genial, gracias por la edición y respuestas que señalan el concepto de grupo no captor –

Respuesta

25

group() y group(0) devolverá la coincidencia completa. Los grupos subsiguientes son grupos de captura reales.

>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0)) 
aaa_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1)) 
_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
IndexError: no such group 
1

Probar:

print(re.match(r"(?:aaa)(_bbb)", string1).group(1)) 

group() es igual que group(0) y Grupo 0 siempre está presente y es el conjunto RE partido.

2

TFM:

class re.MatchObject

group([group1, ...])

devuelve uno o más subgrupos del partido. Si hay un único argumento, el resultado es una sola cadena; si hay múltiples argumentos, el resultado es una tupla con un elemento por argumento. Sin argumentos, el grupo 1 se establece por defecto en cero (se devuelve la coincidencia completa). Si un argumento groupN es cero, el valor de retorno correspondiente es toda la cadena coincidente.

0

Debe especificar group(1) para obtener solo la parte capturada por el paréntesis (_bbb en este caso).

group() sin parámetros devolverá toda la cadena a la expresión regular completa coincidente, sin importar si algunas partes de ella fueron capturadas adicionalmente entre paréntesis o no.

+0

gracias por la explicación detallada :) –

55

Creo que está malinterpretando el concepto de "grupo no captor". El texto que coincide con un grupo que no captura se convierte en parte de la concordancia de expresión regular global.

Tanto la regex (?:aaa)(_bbb) como la regex (aaa)(_bbb) devuelven aaa_bbb como la coincidencia general. La diferencia es que la primera expresión regular tiene un grupo de captura que devuelve _bbb como coincidencia, mientras que la segunda expresión regular tiene dos grupos de captura que devuelven aaa y _bbb como sus respectivas coincidencias. En su código de Python, para obtener _bbb, debe usar group(1) con la primera expresión regular, y group(2) con la segunda expresión regular.

El principal beneficio de los grupos que no capturan es que puede agregarlos a una expresión regular sin alterar la numeración de los grupos de captura en la expresión regular. También ofrecen un rendimiento (ligeramente) mejor ya que el motor de expresiones regulares no tiene que realizar un seguimiento del texto que coinciden con los grupos que no capturan.

Si realmente desea excluir aaa de la coincidencia total de expresiones regulares, entonces necesita usar lookaround. En este caso, el truco positivo es el truco: (?<=aaa)_bbb. Con esta expresión regular, group() devuelve _bbb en Python. No se necesitan grupos de captura.

Mi recomendación es que si tiene la capacidad de utilizar grupos de captura para obtener parte de la coincidencia de expresiones regulares, utilice ese método en lugar de mirar hacia atrás.

+3

Esta es una respuesta mucho más útil que la aceptada. – drstevok

0

Utilice el método de grupos en el objeto de coincidencia en lugar de en el grupo. Devuelve una lista de todos los búferes de captura. El método de grupo sin argumentos devuelve la coincidencia completa de la expresión regular.

Cuestiones relacionadas