使用Python去除IP地址中的前导零

3

移除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的解决方案。


3
clean_ip = ".".join([str(int(x)) for x in ip.split(".")])翻译:该代码的作用是将IP地址中每个数字转换为整数后,再以点号分隔符(.)连接起来,返回处理后的整洁的IP地址。 - havanagrawal
6个回答

6
使用netaddr库,然后它有ZEROFILL标志:
import netaddr

ip = "055.023.156.008"

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

# IPAddress('55.23.156.8')

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

5
ip = "100.020.003.400"
print '.'.join(str(int(part)) for part in ip.split('.'))
# 100.20.3.400

只是一个提示,方括号是多余的。 - Alter
1
@Alter 不一定。''.join() 从传入的可迭代对象构造一个列表,因此预先传入一个列表可能会提高速度。 - Christian Dean
有趣!我现在正在尝试测试它。我查看了PySequence_Fast,但没有找到任何明确说明它可以更快地处理列表的内容,但这可能是真的。 - Alter
使用100万个自动生成的IP地址,列表方法需要大约11.2秒,而生成器需要平均多次运行时约11.5秒。因此它略微更快。编辑我包括生成IP的时间,没有这个,它在3.2秒到2.8秒之间更为明显。 - Alter

3

如果是 2.6 版本之前的 Python,您可以使用字符串模板操作符。但是我们不讨论这个。

如果使用了 format 方法(自 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('.'))

对于Python ≥3.6,我们可以使用f-string:

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

如果您能使用最后一个,我强烈推荐它。非常令人满意。

不错!这在Python 3.6和Python 3.5上对我有效。不过Python 2就不确定了。 - Christian Dean
@ChristianDean 应该至少在2.7版本中工作。其他版本不确定。 - Rick
好的,幽灵点踩者。有没有机会解释一下你自己的行为? - Rick

0
使用捕获组匹配最后一位数字并复制它,以防止所有数字被替换。
ip = re.sub(r'\b0+(\d)', r'\1', ip_with_zeroes)

0
你可以通过"."进行分割,转换为整数然后转换为字符串,最后再用"."进行连接。
ip = ".".join([str(int(i)) for i in ip.split(".")])

0

在Python 3.3+中最简单的方法是使用内置的ipaddress模块

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

将打印

127.0.0.1

但请注意,如果IP地址无效,您将会收到一个ValueError异常。好消息是,这也适用于IPv6地址。


感谢您在2017年像Reut Sharabani一样提出了ipaddress,但是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"。干杯 - oHo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接