我想寫一些代碼,可以快速返回一個正確壓縮的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