簡體   English   中英

Python 正則表達式與前綴長度匹配 ip 地址

[英]Python regex to match ip address with prefix length

我需要一個正則表達式,它將匹配以下模式abc.d /nn ,例如192.168.0.24 /32

同時我想做一些驗證,以便在八位字節中第一個數字可能只有 1 或 2,如果最后 3 個八位字節僅包含 1 個數字,它也可以是 0。 此外,八位字節的數量應達到 255。與 /nn 類似,第一個數字應該只有 1 到 3,但如果是 3,則第二個應該從 0 到 2,如果第一個是沒有,那么唯一的數字應該是從 1 到 9。

我可以這樣寫模式

(?<!\d)(?!0|4|5|6|7|8|9)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} +/(?<!\d)(?!0|4|5|6|7|8|9)\d{1,2}

但例如192.168.740.056 /39也匹配它。

使用正則表達式驗證 IP 地址是一個壞主意 - 這將通過 999.999.999.999 作為有效地址。 改用套接字嘗試這種方法 - 更好的驗證,即使不是更容易做到也同樣簡單。

import socket

def valid_ip(address):
    try: 
        socket.inet_aton(address)
        return True
    except:
        return False

print(valid_ip('10.10.20.30'))
print(valid_ip('999.10.20.30'))
print(valid_ip('gibberish'))

這對你有用嗎?

def find_ips(ip_string):
    for match in re.finditer(r'(?P<ip>[12]\d*\.\d+\.\d+\.\d+)\s+/(?P<mask>\d+)', ip_string):
        octets = list(map(int, match.group('ip').split('.')))
        if all(0 <= octet <= 255 for octet in octets) and int(match.group('mask')) <= 32 and octets[-1] > 0:
            yield match.group()

# ips = ['192.168.0.1 /32', '22.22.22.22 /32']
ips = list(find_ips("ip1=8.8.8.8 /32; ip2=192.168.0.1 /32; ip3=22.22.22.22 /32; ip4=192.168.740.056 /39"))

暫無
暫無

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

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