2010-05-23 11 views
18

moich przyjaciół,Extract adres IP z ciągiem html (Python)

naprawdę chcę, aby wyodrębnić prostego adresu IP z ciągiem (faktycznie html jedna linia) przy użyciu Pythona. Ale okazało się, że minęły 2 godziny, wciąż nie mogłem wymyślić dobrego rozwiązania.

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

- "165.91.15.131" jest tym, czego chcę!

Próbowałem używać wyrażeń regularnych, ale jak dotąd mogę uzyskać tylko pierwszą liczbę.

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

W rzeczywistości, nie czuję mam zaistnieć na REG-ekspresji i powyższy kod został znaleziony i modyfikowany w innych miejscach w sieci.

Szukajcie swojego wkładu i pomysłów!

+0

możliwy duplikat [wyrażenia regularnego pasującego do nazwy hosta lub adresu IP?] (Http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address) –

Odpowiedz

39

Usuń grupę przechwytywania:

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

Wynik:

['165.91.15.131'] 

Uwagi:

  • Jeśli parsowania HTML może to być dobry pomysł, aby spojrzeć na BeautifulSoup.
  • Twoje wyrażenie regularne pasuje do niektórych nieprawidłowych adresów IP, takich jak 0.00.999.9999. Nie musi to być problemem, ale powinieneś być tego świadomy i być może poradzić sobie z tą sytuacją. Można zmienić + na {1,3} dla częściowej poprawki bez nadmiernego skomplikowania wyrażenia regularnego.
+0

Dziękuję bardzo, Znak.To jest to! – GoJian

+1

Możesz użyć wyrażenia regularnego, aby zaakceptować tylko prawidłowe adresy IP "\\ 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

Bardzo ładne. Dla tych z was, którzy byli zainteresowani wpływem (?: ...), można go znaleźć na stronie http://docs.python.org/2/library/re.html: "(?: .. .) Nieprzyciskowa wersja zwykłych nawiasów pasuje do tego, co zwykłe wyrażenie znajduje się w nawiasach, ale podciągu dopasowanego przez grupę nie można odzyskać po wykonaniu dopasowania lub odwołaniu w dalszej części wzorca. " – RussellStewart

7

Można użyć następującego wyrażenia regularnego do przechwytywania adresów IP tylko ważny

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) 

powraca

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

Cool. To jest dobry pomysł. – GoJian

+1

Technicznie nie pasuje to do prawidłowych adresów IP, ale do prawidłowych oktetów. Może być ich dowolna liczba, które mogą wymagać sprawdzenia w oddzielnym kroku. –

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

To jak mam to zrobić. Myślę, że jest tak czysta

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() zwraca IP na sznurku lub Brak

można zastąpić address_regexp dla innych wyrażeń regularnych, jeśli wolisz bardziej dokładnego analizowania czy może zmienić dostawcę usług internetowych.

1

najprostszym sposobem, aby znaleźć adres IP z dziennika ..

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) 

W [42]: info

Out [42]: [ '165.91.15.131']

+0

Proszę wyjaśnić to [\ d .-] +, '- po. co będzie reprezentować –