【问题标题】:Python regex to match IP-address with /CIDRPython 正则表达式将 IP 地址与 /CIDR 匹配
【发布时间】:2011-05-12 20:51:46
【问题描述】:
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)

如何修改它,使其不仅匹配 IPv4,还匹配 10.10.10.0/24 之类的 CIDR?

【问题讨论】:

    标签: python regex pattern-matching ip-address cidr


    【解决方案1】:

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

    【讨论】:

    • 400.123.34.56 匹配但无效(但asdasdasd的正则表达式也有同样的问题)
    • 仅供参考,'/' 可能需要在 Javascript 等语言中转义。
    【解决方案2】:

    \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
    

    【讨论】:

      【解决方案3】:
      【解决方案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)(?:\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))")
      

      (?&lt;!\d\.)(?&lt;!\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】:

          这扩展了您现有的表达式

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

          【讨论】:

            【解决方案8】:

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

            这会让你得到r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?" 的模式。

            【讨论】:

              【解决方案9】:

              netaddr 的 ip 模块中有一个 all_matching_cidrs(ip, cidrs) 函数,它接受一个 ip 并将其与 CIDR 地址列表匹配。

              【讨论】:

                猜你喜欢
                • 2022-12-07
                • 1970-01-01
                • 2012-04-27
                • 1970-01-01
                • 2011-08-17
                • 2011-08-27
                • 2012-05-17
                • 2015-10-26
                • 2011-03-01
                相关资源
                最近更新 更多