2011-05-18 79 views
0

我想匹配一個簡化版本的IP地址(我相信這個模式應該匹配所有IP地址,然後是一些不是IP地址的東西,但這並不重要) m在Python中使用此語法:使用正則表達式匹配ip地址

'([0-9]{1,3}\.){3}[0-9]{1,3}' 

但是,例如,它匹配「127.」。據我所知,它將我提供的模式解釋爲模式列表,而不是單一模式。我錯過了什麼?

更新:是的,抱歉,大家,我有一個錯字。我修好了它。

大家都說這種模式是完美的,但我沒有得到。也許我的問題在於其他方面:。

 matches = regex.findall(line) 
     for match in matches: 
      matchList.add(label + match) 

如果我使用模式 '(' \ d {1,3} \ d {1,3} \ d {1,3} \ d {1, 3}'代替(同樣的東西,我只是重複,這個作品完美,並提供了一個完整的IP地址。但是,如果我使用上面的模式,它會給'195.'

如果我把paren放在這個表達式((\ d {1,3}。){3} \ d {1,3})',label + match給我錯誤'不能連接字符串和元組對象'

+1

請參閱http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address以獲取有效的IP正則表達式。 – garnertb 2011-05-18 11:18:32

+1

我認爲你在那個正則表達式中有一個錯字。你的意思是([0-9] {1,3} \。){3} \。[0-9] {1,3}? – cwallenpoole 2011-05-18 11:19:07

回答

2

快速回答做工精細,用這個來代替:

(?:[0-9]{1,3}\.){3}[0-9]{1,3} 

龍答:

使用127.0.0.1作爲一個例子,你發佈的正則表達式只會匹配「0」。而不是完整的地址。你使用的圓括號創建了一個匹配組,它告訴解析器確保找到整個模式,但只返回匹配()組中的內容,這留下了「127.0.0」。加正則表達式在默認情況下是貪婪的,並且會自動選擇最遠/最後的可能匹配。所以在這種情況下,括號之後的{3}就像是一個索引,結果是第三個匹配,因此「0」。

一組圓括號自己創建一個匹配組,但您想要的是一個不匹配的組。在第一個括號之後加上一個?:就像我上面所示的那樣來表示這一點。這樣它仍然會爲整條線返回一個匹配。這應該給你你正在尋找的「簡化」正則表達式。

0

試試這個

引自this

def is_valid_ipv4(ip): 
    """Validates IPv4 addresses. 
    """ 
    pattern = re.compile(r""" 
     ^
     (?: 
      # Dotted variants: 
      (?: 
      # Decimal 1-255 (no leading 0's) 
      [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2} 
      | 
      0x0*[0-9a-f]{1,2} # Hexadecimal 0x0 - 0xFF (possible leading 0's) 
      | 
      0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's) 
     ) 
      (?:     # Repeat 0-3 times, separated by a dot 
      \. 
      (?: 
       [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2} 
      | 
       0x0*[0-9a-f]{1,2} 
      | 
       0+[1-3]?[0-7]{0,2} 
      ) 
     ){0,3} 
     | 
      0x0*[0-9a-f]{1,8} # Hexadecimal notation, 0x0 - 0xffffffff 
     | 
      0+[0-3]?[0-7]{0,10} # Octal notation, 0 - 037777777777 
     | 
      # Decimal notation, 1-4294967295: 
      429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}| 
      42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}| 
      4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8} 
     ) 
     $ 
    """, re.VERBOSE | re.IGNORECASE) 
    return pattern.match(ip) is not None 
+1

他只是說他不在乎它是否與其他事物相匹配。 這是不回答問題 – 2011-05-18 11:25:32

0

在[0-9]出現錯字之前就是斜線嗎?

如果是這樣,如果圍繞整個表達式'(([0-9]{1,3}\.){3}[0-9]{1,3})'添加括號,您將創建一個捕獲組,捕獲整個匹配。否則,你只是捕獲你的字符串的一部分。

1

也許你錯誤的東西,當你張貼,但當我用你的正則表達式發佈,它不匹配「127」。或「127.0.0.1」。當我刪除了多餘的反斜槓,它似乎爲我

In [22]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.0.0.1') 
Out[22]: <_sre.SRE_Match object at 0x1013de5d0> 

In [23]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.') 
+0

同樣,對我來說。 – 2011-05-18 11:25:03

相關問題