簡體   English   中英

用於匹配IPV4地址的Python正則表達式不起作用

[英]Python regular expression to match IPV4 address doesn't work

我正在使用re庫。

def validate_ip(self, ip):
    pattern = re.compile(r'([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.{4}')
    matchObj = re.match(pattern, ip)

    if matchObj == None:
        print "Invalid IP:", ip
        sys.exit(0)

當我通過IP 192.0.0.0時 ,輸出是:

Invalid IP: 192.0.0.0

為什么不匹配?

您的模式匹配一​​個3位數字,后跟恰好4個點:

>>> pattern = re.compile(r'([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.{4}')
>>> pattern.match('255....')
<_sre.SRE_Match object at 0x1026eda80>

{4}不適用於它之前的所有內容; 它僅適用於只是 \\.

你想要這個:

r'(([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])'

這符合您的數字模式加上a . 3次,因為現在{3}適用於前面的分組表達式中的所有內容(使用(...) )。 然后,您仍需要分別匹配最后一個數字組。

演示:

>>> pattern = re.compile(r'(([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])')
>>> pattern.match('192.0.0.0')
<_sre.SRE_Match object at 0x1023bf588>

順便說一下, if not match:使用if not match:測試匹配失敗; None在布爾上下文中是false值。 即使你真的想測試None ,你也應該使用if match is None: ,使用身份測試。

如果您可以使用Python 3.3+,請使用ipaddress庫。

import ipaddress

for ip in ["192.0.0.0", "0.0.0.0", "192.168.0.256"]:
    try:
        ipaddress.ip_address(ip)
        print("{} is valid".format(ip));
    except ValueError:
        print("{} is invalid".format(ip))

輸出:

192.0.0.0 is valid
0.0.0.0 is valid
192.168.0.256 is invalid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM