2011-05-16 21 views
42

¿Cómo puedo acceder a los grupos capturados si hago findall(r'regex(with)capturing.goes.here')? Sé que puedo hacerlo a través de finditer, pero no quiero repetir.¿Grupo de captura con Findall?

Respuesta

39

findall simplemente devuelve el grupos capturados:

>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123') 
[('de', '123'), ('de', '123')] 

Relevant extracto doc:

Devuelve todas las coincidencias no superpuestas del patrón en cadena, como una lista de cadenas . La cadena se escanea de izquierda a derecha, y las coincidencias son devueltas en el orden encontrado. Si hay uno o más grupos en el patrón , devuelva una lista de grupos; este será una lista de tuplas si el patrón tiene más de un grupo. Las coincidencias vacías se incluyen en el resultado a menos que toquen el comienzo de otra coincidencia.

15

Use grupos libremente. Los partidos se devuelven como una lista de grupos de pares ordenados:

>>> re.findall('(1(23))45', '12345') 
[('123', '23')] 

Si desea que el partido completo que se incluirán, simplemente encierre toda la expresión regular en un grupo:

>>> re.findall('(1(23)45)', '12345') 
[('12345', '23')] 
1

Varias maneras posibles:

>>> import re 
>>> r = re.compile(r"'(\d+)'") 
>>> result = r.findall("'1', '2', '345'") 
>>> result 
['1', '2', '345'] 
>>> result[0] 
'1' 
>>> for item in result: 
...  print(item) 
... 
1 
2 
345 
>>> 
+1

Creo que está preguntando acerca de los grupos de expresiones regulares interior como en '(grupo 1) .. (Grupo 2)' – bluepnume

+0

@bluepnume: Quizás, pero su pregunta no es tan clara. Su ejemplo solo tiene un grupo de captura. –

0
import re 
string = 'Perotto, Pier Giorgio' 
names = re.findall(r''' 
       (?P<first>[-\w ]+),\s #first name 
       (?P<last> [-\w ]+) #last name 
       ''',string, re.X|re.M) 

print(names) 

vuelve

[('Perotto', 'Pier Giorgio')] 

re.M tendría sentido si su cadena consta de varias líneas. También es necesario VERBOSE modo (igual a re.X) en la expresión regular que he escrito porque está utilizando '''

Cuestiones relacionadas