【问题标题】:Remove leading zeros in IP address using Python使用 Python 删除 IP 地址中的前导零
【发布时间】:2018-12-08 07:48:20
【问题描述】:

删除 IP 地址中不必要的零:

100.020.003.400  ->  100.20.3.400
001.200.000.004  ->  1.200.0.4
000.002.300.000  ->  0.2.300.0   (optional silly test)

我的尝试并非在所有情况下都奏效:

import re
ip = re.sub('[.]0+', '.', ip_with_zeroes)

有类似的问题,但对于其他语言:

请提供 Python v2 和 v3 的解决方案。

【问题讨论】:

  • clean_ip = ".".join([str(int(x)) for x in ip.split(".")])

标签: python python-2.7 python-3.x ip-address leading-zero


【解决方案1】:

使用netaddr library,然后它有ZEROFILL 标志:

import netaddr

ip = "055.023.156.008"

no_zero_ip = netaddr.IPAddress(ip, flags=netaddr.ZEROFILL).ipv4()

# IPAddress('55.23.156.8')

如果您不想要 IPAddress 类型,您可能希望将 no_zero_ip 结果更改为字符串或其他内容

【讨论】:

    【解决方案2】:
    ip = "100.020.003.400"
    print '.'.join(str(int(part)) for part in ip.split('.'))
    # 100.20.3.400
    

    【讨论】:

    • 请注意,方括号是多余的
    • @Alter 不一定。 ''.join() constructs a list from the iterable passed in 无论如何,所以它可能会提高预先传递列表的速度。
    • 有趣!我现在正在尝试测试它。我查看了 PySequence_Fast 并找不到任何明确表示它可以更快地列出的内容,但这可能是真的。
    • 有 10** 6 个自动生成的 IP 地址,list 方法需要约 11.2 秒,生成器需要约 11.5 秒,在多次运行中平均。所以它稍微快一点。 edit我是包括生成ips的时间,没有那个,在3.2s到2.8s时更明显
    【解决方案3】:

    对于 2.6 之前的版本,您可以使用字符串取模运算符。但我们不要谈论这个。

    这应该早在引入format method 时就做到了(2.6):

    '.'.join('{0}'.format(int(i)) for i in ip.split('.'))
    

    可选地消除python≥3.3或≥2.7的索引(我认为):

    '.'.join('{}'.format(int(i)) for i in ip.split('.'))
    

    并且仅对于 ≥3.6 的 python,我们可以将它串起来:

    '.'.join(f'{int(i)}' for i in ip.split('.'))
    

    如果你可以使用最后一个,我强烈推荐它。这是相当令人满意的。

    【讨论】:

    • 不错!这适用于 Python 3.6 和 Python 3.5。不过不确定 Python 2。
    • @ChristianDean 至少应该在 2.7 中工作。不确定其他人。
    • OK Phantom downvoter。有没有机会解释一下自己?
    【解决方案4】:

    使用捕获组匹配最后一个数字并复制它,以防止所有数字被替换。

    ip = re.sub(r'\b0+(\d)', r'\1', ip_with_zeroes)
    

    【讨论】:

      【解决方案5】:

      你可以用“。”分割。转整数再转字符串,用“.”连接

      ip = ".".join([str(int(i)) for i in ip.split(".")])
      

      【讨论】:

        【解决方案6】:

        在 Python 3.3+ 上执行此操作的最简单方法是使用内置的 ipaddress 模块

        import ipaddress
        print(str(ipaddress.ip_address("127.000.000.1")))
        

        将打印

        127.0.0.1
        

        但请注意,如果 IP 地址无效,您会收到 ValueError 异常。好的部分是这也适用于 IPv6 地址。

        【讨论】:

        • 感谢您提议 ipaddress,就像 Reut Sharabani 在 2017 年所做的那样,但 ipaddress 未能从 "010.10.10.10" 中删除前导零。提出的ValueError: u'010.10.10.10' does not appear to be an IPv4 or IPv6 address 令人惊讶,因为"10.10.10.10" 是一个有效的IPv4 地址。因此模块ipaddress 不是一个好的选择:-( 供您参考ipaddress 也可用于Python 2.7,但输入字符串应为u"10.10.10.10"。干杯
        猜你喜欢
        • 2020-01-20
        • 2014-09-16
        • 2012-04-14
        • 2015-03-18
        • 2017-06-13
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2014-01-27
        相关资源
        最近更新 更多