我想写一些代码,可以快速返回一个正确压缩的IPv6地址。我试过...快速Python的IPv6压缩
socket.inet_pton(socket.AF_INET6,socket.inet_PTON(socket.AF_INET6,address))
ipaddress.IPv6Address(address)
IPy.IP(address)
...从处理IPv6压缩的速度越快越慢。第一个是最快的(每65,565个IP地址〜3.6秒),第二个比第一个快不到一半(每个65,565个IP地址〜8.4秒),最后一个几乎是第二个(~14.4秒每65,565个IP地址)。
于是,我开始着手创建自己的...
import re
from ipaddress import IPv6Address
IPaddlist = [
'2001:db8:00:0:0:0:cafe:1111',
'2001:db8::a:1:2:3:4',
'2001:0DB8:AAAA:0000:0000:0000:0000:000C',
'2001:db8::1:0:0:0:4',
'2001:4958:5555::4b3:ffff',
]
for addr in IPaddlist:
address = ":".join('' if i=='0000' else i.lstrip('0') for i in addr.split(':'))
address2 = (re.sub(r'(:)\1+', r'\1\1', address).lower())
print(address2)
print(IPv6Address(addr))
print('\n')
它返回:
2001:db8::cafe:1111
2001:db8::cafe:1111
2001:db8::a:1:2:3:4
2001:db8:0:a:1:2:3:4
2001:db8:aaaa::c
2001:db8:aaaa::c
2001:db8::1::4
2001:db8:0:1::4
2001:4958:5555::4b3:ffff
2001:4958:5555::4b3:ffff
每个条目的第一行是我的代码,第二个是正确的压实,使用ipaddress.IPv6Address。
正如你所看到的,我很接近,但你知道他们说的“亲密”什么......
任何人有任何指针?我似乎遇到了障碍。
的问题是,你也可以用'::'紧凑型最长的零序列。一个简单的正则表达式*不能*处理这种上下文信息...但是你可以尝试检查事实。所以看看'::'是否出现至少两次,如果是这样,确定哪个是正确的出现,并用':0:'替换其他的。 – Bakuriu