Python 正则表达式将 IP 地址与 /CIDR 匹配
Posted
技术标签:
【中文标题】Python 正则表达式将 IP 地址与 /CIDR 匹配【英文标题】:Python regex to match IP-address with /CIDR 【发布时间】:2011-05-12 20:51:46 【问题描述】:m = re.findall("\d1,3\.\d1,3\.\d1,3\.\d1,3",s)
如何修改它,使其不仅匹配 IPv4,还匹配 10.10.10.0/24
之类的 CIDR?
【问题讨论】:
【参考方案1】:(?:\d1,3\.)3\d1,3(?:/\d\d?)?
【讨论】:
400.123.34.56 匹配但无效(但asdasdasd的正则表达式也有同样的问题) 仅供参考,'/' 可能需要在 javascript 等语言中转义。【参考方案2】:\d1,3\.\d1,3\.\d1,3\.\d1,3(?:/\d1,2|)
在Expresso测试
匹配:
64.33.232.212
64.33.232.212/30
【讨论】:
【参考方案3】:这个页面好像有解决办法http://hse-at-work.blogspot.com/2006/11/regular-expression-to-match-ipv4.html
【讨论】:
【参考方案4】:我在使用类似于您的正则表达式时遇到了问题。它匹配 1.2.3.4.5(作为 1.2.3.4)和 1111.2.3.4(作为 111.2.3.4)。为了避免匹配这些,我添加了前瞻/后瞻断言:
IP_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d1,3\.)3\d1,3(?!\d|(?:\.\d))")
IP_CIDR_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d1,3\.)3\d1,3/\d1,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
【讨论】:
【参考方案5】:刚刚做了一个非常好的正则表达式,它还检查 ip 格式的正确性,不会太长,并且可以选择匹配子网长度:
(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?
【讨论】:
更好:'\b(25[0-5]|2[0-4]\d\b|1\d\d|\d\d|\d)\b\ .\b(?1)\b\.\b(?1)\b\.\b(?1)\b\b(\/\d\d|\/\d)?\b'跨度> 【参考方案6】:正则表达式(ip_address 有/无 CIDR)
试试这个:
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)
输出:
是的,IP 地址 0.0.0.0/0 是正确的
是的,IP 地址 255.255.255.255/21 是正确的
是的,IP 地址 17.2.5.0/21 是正确的
是的,IP 地址 29.29.206.99 是正确的
不,IP地址不正确
【讨论】:
【参考方案7】:这扩展了您现有的表达式
\d1,3\.\d1,3\.\d1,3\.\d1,3\\\d1,2
【讨论】:
【参考方案8】:追加"(?:/\d1,2)?"
。
这会让你得到r"\d1,3\.\d1,3\.\d1,3\.\d1,3(?:/\d1,2)?"
的模式。
【讨论】:
【参考方案9】:netaddr 的 ip 模块中有一个 all_matching_cidrs(ip, cidrs) 函数,它接受一个 ip 并将其与 CIDR 地址列表匹配。
【讨论】:
以上是关于Python 正则表达式将 IP 地址与 /CIDR 匹配的主要内容,如果未能解决你的问题,请参考以下文章