2012-01-25 12 views
10

Do szkoły mam napisać skrypt Python RE, który wyodrębnia adresy IP. Wyrażenie regularne, którego używam, wydaje się działać z re.search(), ale nie z re.findall().Wyrażenia regularne w języku Python - re.search() kontra 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() 

Mecz bo to zawsze 192.168.0.185, ale jest inaczej, gdy robię 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. 

Zastanawiam się dlaczego re.findall() plony 0. Kiedy re.search() plony 192.168.0.185, bo” m używając tego samego wyrażenia dla obu funkcji.

Co mogę zrobić, aby w rzeczywistości było zgodne z wyrażeniem re.findall()? Czy robię jakiś błąd?

Odpowiedz

12

findall zwraca listę meczów, a od dokumentacji:

Jeśli jedna lub więcej grup są obecne we wzorcu, zwracają listę grup; będzie to lista krotek, jeśli wzór ma więcej niż jedną grupę.

Tak, poprzednia wyrażenie miał jedną grupę pasującego 3 razy w ciągu którym ostatni mecz był 0.

Aby rozwiązać swój problem: exp = "(?:\d{1,3}\.){3}\d{1,3}" wykorzystania; przy użyciu wersji bez grupowania nie ma zwróconych grup, więc mecz jest zwracany w obu przypadkach.

+0

To działa dobrze, dziękuję. – user1168906

3

Przechwytujesz tylko 0 w tym regexie, ponieważ będzie to ostatni, który został złapany.

Zmień wyrażenie uchwycić całą IP, a powtarzające się część być zakaz robienia grupa:

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]: 

A jeśli to pomaga wyjaśnić regex:

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 

To wyjaśnia podteksty. Subpattern 1 jest tym, co zostaje złapane przez findall.

Powiązane problemy