2010-05-23 14 views
18

Mis Amigos,dirección IP Extracto de una cadena HTML (pitón)

Realmente quiero extraer una dirección IP simple a partir de una cadena (en realidad un html de una línea) usando Python. Pero resulta que pasaron 2 horas, todavía no podía encontrar una buena solución.

>>> s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>" 

- '165.91.15.131' es lo que quiero!

Intenté usar la expresión regular, pero hasta ahora solo puedo obtener el primer número.

>>> import re 
>>> ip = re.findall(r'([0-9]+)(?:\.[0-9]+){3}', s) 
>>> ip 
['165'] 

De hecho, no me siento que tengo un control firme sobre reg-expresión y el código anterior fue encontrado y modificado a partir de otros lugares en la web.

¡Busque su opinión e ideas!

+0

posible duplicado de [¿Expresión regular para coincidir con el nombre de host o la dirección IP?] (Http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address) –

Respuesta

39

eliminamos su grupo de captura:

ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', s) 

Resultado:

['165.91.15.131'] 

Notas:

  • Si análisis de HTML que podría ser una buena idea mirar BeautifulSoup.
  • Su expresión regular coincide con algunas direcciones IP inválidas como 0.00.999.9999. Esto no es necesariamente un problema, pero debe tenerlo en cuenta y posiblemente manejar esta situación. Puede cambiar + a {1,3} para una reparación parcial sin hacer que la expresión regular sea demasiado compleja.
+0

Muchas gracias, Marca.¡Eso es todo! – GoJian

+1

Puede usar la expresión de expresiones regulares para aceptar solo direcciones IP válidas "\\ b (? :(?: 25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] ] [0-9]?) \\.) {3} (?: 25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9 ]?) \\ b " – o0rebelious0o

+0

Muy agradable. Para aquellos de ustedes que estaban interesados ​​en el impacto de (?: ...), pueden encontrarlo en los documentos http://docs.python.org/2/library/re.html: "(?: .. .) Una versión no capturable de paréntesis regulares. Coincide con cualquier expresión regular que esté dentro de los paréntesis, pero la subcadena emparejada por el grupo no se puede recuperar después de realizar una coincidencia o hacer referencia más adelante en el patrón. " – RussellStewart

7

Usted puede usar la siguiente expresión regular para capturar sólo IP válida aborda

re.findall(r'\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b',s) 

vuelve

['165', '91', '15', '131'] 
+0

Cool. Esta es una buena idea. – GoJian

+1

Técnicamente, esto no coincide con las direcciones IP válidas sino con los octetos válidos. Puede haber un número de ellos, que puede ser necesario verificar en un paso separado. –

3
import re 

ipPattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 

findIP = re.findall(ipPattern,s) 

findIP contains ['165.91.15.131'] 
0

Así es como yo lo he hecho. Creo que es tan limpio

import re 
import urllib2 

def getIP(): 
    ip_checker_url = "http://checkip.dyndns.org/" 
    address_regexp = re.compile ('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 
    response = urllib2.urlopen(ip_checker_url).read() 
    result = address_regexp.search(response) 

    if result: 
      return result.group() 
    else: 
      return None 

get_IP() devuelve IP en una cadena o Ninguno

Puede sustituir address_regexp para otras expresiones regulares si usted prefiere un análisis más preciso o tal vez cambiar el proveedor de servicios web.

1

forma más fácil de encontrar la dirección IP del registro ..

s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>" 
info = re.findall(r'[\d.-]+', s) 

En [42]: información

Salida: [42]: [ ''] 165.91.15.131

+0

Podría explicar esto [\ d .-] +, '- after. lo que representará –