【问题标题】:Python regex to match ip address with prefix lengthPython正则表达式将IP地址与前缀长度匹配
【发布时间】:2021-12-31 13:26:16
【问题描述】:

我需要一个匹配以下模式a.b.c.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 也匹配它。

【问题讨论】:

    标签: python validation ip


    【解决方案1】:

    使用正则表达式验证 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'))
    

    【讨论】:

    • 感谢您的回复。我知道套接字模块。但是,IP 地址与前缀长度相结合,例如“a.b.c.d /nn” 将字符串与上述模式完全匹配的方法是什么?
    【解决方案2】:

    这对你有用吗?

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

    【讨论】:

    • 谢谢。我会检查你的代码并回复我的答案,因为我仍然不擅长编码。但是,我可以只用一行来实现这一点,它有点长,但效果很好。 (1[0-9][0-9]|2[0-5][0-5]|[1-9][0-9](?=)|[1-9])\.(1 [0-9][0-9]|2[0-5][0-5]|[1-9][0-9](?=)|[0-9])\.(1[0 -9][0-9]|2[0-5][0-5]|[1-9][0-9](?=)|[0-9])\.(1[0-9 ][0-9]|2[0-5][0-5]|[1-9][0-9](?=)|[0-9]) +/(1[0-9]| 2[0-9]|3[0-2](?=)|[1-9])
    猜你喜欢
    • 2011-05-12
    • 2022-12-07
    • 2011-10-24
    • 2012-04-27
    • 1970-01-01
    • 2011-08-17
    • 2011-08-27
    • 2012-05-17
    • 2015-10-26
    相关资源
    最近更新 更多