【问题标题】:Regex for range of IPv4 addressesIPv4 地址范围的正则表达式
【发布时间】:2015-06-23 05:06:02
【问题描述】:

对于像 169.254.0.0/16 或 192.168.0.0/16 这样的 IPv4 地址范围,为每个地址构建一个正则表达式很简单,因为一旦你完全匹配前 6 位数字,你就完成了。

但是如何匹配一个更宽松的保留范围内的任何地址,例如

100.64.0.0 –
100.127.255.255

100\. 开头的正则表达式是不够的,因为会有超出 100.64 和 100.127 界限的数字(例如 100.65.0.0、100.127.255.256)会被错误匹配。如何最好地捕获这样的范围,而不必明确定义每个范围内的每个有效子范围?语言是 Python。

作为参考,可以在here 找到保留 IP 地址和范围的完整列表。

【问题讨论】:

  • @TessellatingHeckler 因为 ipaddress.ip_address 只会告诉我地址​​是有效的。它不能帮助我检测保留的 IP 地址。
  • @Pyderman 是的。 try: addr = IPv4Address(text); except ValueError: print("not a valid IP address")if addr in IPv4Network('100.64.0.0/10'): print("that's a reserved address")
  • @Pyderman 你错过了 Python 容器类型的奇迹。 “网络地址”。试试IPv4Address('100.64.1.1') in IPv4Network('100.64.0.0/10'),它会说是。试试IPv4Address('100.63.1.1') in IPv4Network('100.64.0.0/10') 是假的

标签: python regex


【解决方案1】:

首选使用 IPv4 解析库。如果你坚持使用正则表达式,

re.search('^(100\.(6[4-9]|[7-9]\d|1[0-1]\d|12[0-7])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){2})$', text)

你可以看到我在单独搜索:

  • 64-69 (6[4-9])
  • 70-99 ([7-9]\d)
  • 100-119 (1[0-1]\d)
  • 120-127 (12[0-7])

  • 0-9 (\d)
  • 10-99 ([1-9]\d)
  • 100-199 (1\d\d)
  • 200-249 (2[0-4]\d)
  • 250-255 (25[0-5])

【讨论】:

    【解决方案2】:

    这是一种方法:

    import re
    
    print re.findall(r'\d+\.\S+\d', 'fdgsdfg 100.127.255.255 ggffgsdf 100.64.0.0 asdffsdf')
    

    输出:

    ['100.127.255.255', '100.64.0.0']
    

    【讨论】:

    • 如果 100.127.255.255 是否在 100.64.0.0/10 子网中,则无法回答。
    • @TessellatingHeckler 你是什么意思?
    • 我的意思是问题不是要从一行文本中提取 IP 地址,这就是您正在做的事情。问题是询问比较一个 IP 地址以查看它是否在另外两个之间。这是“从一行文本中提取一个数字”和“查看一个数字是否在 5 到 15 之间”之间的区别。 IP 地址和网络具有树形结构。 10.0.5.0/24in 10.0.0.0/16 并且它也是 in 8.0.0.0/6,并且在10.0.4.0-10.0.8.254 范围内。问题所要求的正是这种测试 - 与 IP 的工作方式相符的测试。