2012-01-25 21 views
10

Para la escuela Se supone que debo escribir un script de Python RE que extraiga las direcciones IP. La expresión regular que estoy usando parece funcionar con re.search() pero no con re.findall().Expresiones regulares de Python - re.search() vs re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
match = re.search(exp, ip) 
print match.group() 

El partido por el que siempre es 192.168.0.185, pero es diferente cuando lo haga re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
matches = re.findall(exp, ip) 
print matches[0] 

0. 

me pregunto por qué re.findall() rendimientos 0. Cuando re.search() rendimientos 192.168.0.185, ya que' m usando la misma expresión para ambas funciones.

¿Y qué puedo hacer para que re.findall() realmente siga la expresión correctamente? ¿O estoy cometiendo algún tipo de error?

Respuesta

12

findall devuelve una lista de coincidencias, y de la documentación:

Si uno o más grupos están presentes en el patrón, devolver una lista de grupos ; esta será una lista de tuplas si el patrón tiene más de un grupo.

lo tanto, su expresión anterior había un grupo que hacía juego con 3 veces en la cadena donde el último partido fue 0.

Para arreglar su uso problema: exp = "(?:\d{1,3}\.){3}\d{1,3}"; al usar la versión que no se agrupa, no hay grupos devueltos, por lo que la coincidencia se devuelve en ambos casos.

+0

Eso funciona bien, gracias. – user1168906

3

Solo está capturando el 0 en esa expresión regular, ya que será el último capturado.

cambiar la expresión de capturar toda la IP, y la parte repetida a ser una captura no grupal:

In [2]: ip = "blah blah 192.168.0.185 blah blah" 

In [3]: exp = "((?:\d{1,3}\.){3}\d{1,3})" 

In [4]: m = re.findall(exp, ip) 

In [5]: m 
Out[5]: ['192.168.0.185'] 

In [6]: 

Y si esto ayuda a explicar la expresión regular:

In [6]: re.compile(exp, re.DEBUG) 
subpattern 1 
    max_repeat 3 3 
    subpattern None 
     max_repeat 1 3 
     in 
      category category_digit 
     literal 46 
    max_repeat 1 3 
    in 
     category category_digit 

Esto explica los subpatrones. El subpatrón 1 es lo que obtiene capturado por findall.

Cuestiones relacionadas