Python 正则表达式将 IP 地址与 /CIDR 进行匹配

发布于 2024-10-03 14:45:18 字数 146 浏览 4 评论 0原文

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

如何修改它,使其不仅匹配 IPv4,还匹配 CIDR(例如 10.10.10.0/24)?

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

How do I modify it so it will match not only IPv4, but also something with CIDR like 10.10.10.0/24?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

温暖的光 2024-10-10 14:45:18
(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?
(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?
ゃ懵逼小萝莉 2024-10-10 14:45:18
\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
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2}|)

Tested in Expresso

Matched:

64.33.232.212
64.33.232.212/30
独孤求败 2024-10-10 14:45:18

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)

输出:

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

ReGex ( ip_address with/without CIDR )

try this:

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])?
quot;


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
dawn曙光 2024-10-10 14:45:18

我在使用与您类似的正则表达式时遇到问题。它匹配 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))")

(? 检查前面是否没有数字或八位字节你的第一个八位字节(即: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

I had problems using a regex similar to yours. It was matching 1.2.3.4.5 (as 1.2.3.4) and 1111.2.3.4 (as 111.2.3.4). To avoid matching these, I added look ahead/behind assertions:

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))")

The (?<!\d\.)(?<!\d) checks that there isn't a number or octet before your first octet (ie: no 1 before 111.2.3.4).
And (?!\d|(?:\.\d)) checks that there isn't a number/octet after your last (ie: no .5 after 1.2.3.4).

Then, to check that the strings these match are valid IPs (eg: not 277.1.1.1), you can use

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

鲸落 2024-10-10 14:45:18

刚刚做了一个非常好的正则表达式,它还检查 ip 格式的正确性,不是太长,并且可以选择匹配子网长度:

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

Just did a really nice regex that also checks the ip format correctness, isn't to long, and matches subnet length optionally:

(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?
情独悲 2024-10-10 14:45:18

netaddr的ip模块中有一个all_matching_cidrs(ip, cidrs)函数;它需要一个 IP 并将其与 CIDR 地址列表进行匹配。

There is an all_matching_cidrs(ip, cidrs) function in netaddr's ip module; it takes an ip and matches it with a list of CIDR addresses.

一瞬间的火花 2024-10-10 14:45:18

这扩展了你现有的表达方式

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

this extends your existing expression

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}
A君 2024-10-10 14:45:18

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

这让你r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1 ,2})?" 表示模式。

Append "(?:/\d{1,2})?".

That gets you r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?" for a pattern.

烟酉 2024-10-10 14:45:18

我找到的最佳答案是:

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

Best answer I found is:

^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文