Obtener partido de grupo en re.sub en Python

En Perl, me es posible hacer una sustitución y capturar una partida de grupo al mismo tiempo. p.ej

my $string = "abcdef123"; $string =~ s/(\d+)//; my $groupMatched = $1; # $groupMatched is 123 

En Python, puedo hacer la sustitución usando la función re.sub de la siguiente manera. Sin embargo, no puedo encontrar una manera de capturar la coincidencia del grupo \ d + sin invocar otra función para volver a coincidir y realizar una operación adicional.

 string = "abcdef123" string = re.sub("(\d+)", "", string) 

¿Alguien sabe cómo puedo capturar el valor “\ d +” como una variable separada de la misma operación re.sub? Probé el siguiente comando y no funciona.

 print r'\1' 

Puedes engañar y pasar una función para re.sub :

 results = [] def capture_and_kill(match): results.append(match) return "" string = "abcdef123" string = re.sub("(\d+)", capture_and_kill, string) results[0].group(1) # => '123' 

Puedes hacer lo siguiente:

 sub_str = re.search("(\d+)", str).group(1) 

Encontrará la parte “123”.

Entonces lo reemplazas:

 str = str.replace(sub_str, "") 

Tenga en cuenta que si tiene más de [0-9] secuencia, deberá usar findall e iterar manualmente en todas las coincidencias.

debajo del código probado en python 3.6.

 test = "abcdef123" resp = re.sub(r'\w+[A-Za-z](\d+)',r'\1',test) print (resp) 123 

Para basarse en la respuesta de Marouns, también puede hacer lo siguiente:

 str = "foobarzoo" match = re.search(r"foo(bar)", str) 

Luego reemplazarlo con el partido completo “foobar”:

 str = str.replace(match.group(0), "") 

El primer grupo (dentro de los paréntesis) “barra” es accesible por:

 match.group(1) 

Usando este método, str será finalmente igual a “zoo”