簡體   English   中英

Python 正則表達式匹配 IP 地址與 /CIDR

[英]Python regex to match IP-address with /CIDR

m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)

我如何修改它以便它不僅匹配 IPv4,還匹配 CIDR 的內容,例如10.10.10.0/24

(?:\\d{1,3}\\.){3}\\d{1,3}(?:/\\d\\d?)?

做了一個非常不錯的正則表達式,它也檢查ip格式的正確性,不是太長,並且可以選擇匹配子網長度:

(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?

\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(?:/\\d{1,2}|)

Expresso中測試

符合條件:

64.33.232.212
64.33.232.212/30

ReGex(帶/不帶 CIDR 的 ip_address)

嘗試這個:

str1 = '0.0.0.0/0'
str2 = '255.255.255.255/21'
str3 = '17.2.5.0/21'
str4 = '29.29.206.99'
str5 = '265.265.20.20'

pattern = r"^((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]?)([/][0-3][0-2]?|[/][1-2][0-9]|[/][0-9])?$"


def check_ip(user_input):
    match = re.search(pattern, user_input)
    if match:
        print(f"Yes, IP-address {match.string} is correct")
    else:
        print("No, IP-address is incorrect")


check_ip(str1)
check_ip(str2)
check_ip(str3)
check_ip(str4)
check_ip(str5)

output:

Yes, IP-address 0.0.0.0/0 is correct

Yes, IP-address 255.255.255.255/21 is correct

Yes, IP-address 17.2.5.0/21 is correct

Yes, IP-address 29.29.206.99 is correct

No, IP-address is incorrect

使用類似於您的正則表達式時遇到問題。 它與1.2.3.4.5(如1.2.3.4)和1111.2.3.4(如111.2.3.4)相匹配。 為了避免匹配這些內容,我添加了前瞻/斷言聲明:

IP_RE      = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d|(?:\.\d))")
IP_CIDR_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}(?!\d|(?:\.\d))")

(?<!\\d\\.)(?<!\\d)檢查第一個八位位組之前沒有數字或八位位組(即:111.2.3.4之前沒有1)。 然后(?!\\d|(?:\\.\\d))檢查最后一個數字之后沒有數字/八位字節(即:1.2.3.4之后沒有.5)。

然后,要檢查這些匹配的字符串是否是有效的IP(例如:不是277.1.1.1),可以使用

socket.inet_aton(ip) #raises exception if IP is invalid

netaddr的ip模塊中有一個all_matching_cidrs(ip,cidrs)函數,它需要一個ip並將其與CIDR地址列表匹配。

附加"(?:/\\d{1,2})?"

這樣就可以得到r"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(?:/\\d{1,2})?" 為模式。

這擴展了您現有的表情

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}

我找到的最佳答案是:

^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$

暫無
暫無

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

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