468 驗證IP位址

2021-10-10 22:42:44 字數 1833 閱讀 4488

題目描述:編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。如果是有效的 ipv4 位址,返回 「ipv4」 ;如果是有效的 ipv6 位址,返回 「ipv6」 ;如果不是上述型別的 ip 位址,返回 「neither」 。ipv4 位址由十進位制數和點來表示,每個位址包含 4 個十進位制數,其範圍為 0 - 255, 用(".")分割。比如,172.16.254.1;同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。ipv6 位址由 8 組 16 進製的數字來表示,每組表示 16 位元。這些組數字通過 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是乙個有效的位址。而且,我們可以加入一些以 0 開頭的數字,字母可以使用大寫,也可以是小寫。所以, 2001:db8:85a3:0:0:8a2e:0370:7334 也是乙個有效的 ipv6 address位址 (即,忽略 0 開頭,忽略大小寫)。然而,我們不能因為某個組的值為 0,而使用乙個空的組,以至於出現 (::)的情況。 比如,2001:0db8:85a3::8a2e:0370:7334 是無效的 ipv6 位址。同時,在 ipv6 位址中,多餘的 0 也是不被允許的。比如02001:0db8:85a3:0000:0000:8a2e:0370:7334 是無效的。

解題思路:分別考慮ipv4和ipv6的情況,然後將各種可能的錯誤情況一一進行排除即可,**如下:

class

solution

:def

validipaddress

(self, ip:

str)

->

str:

if'.'

in ip:

items = ip.split(

'.')

iflen

(items)!=4

:return

"neither"

for item in items:

try:

num =

int(item)if(

len(item)

>

1and item[0]

=='0'

)or num >

255:

return

"neither"

except

:return

"neither"

return

"ipv4"

else

: items = ip.split(

':')

iflen

(items)!=8

:return

"neither"

for item in items:

iflen

(item)

>

4or item =='':

return

"neither"

else

:for c in item:

code =

ord(c)

ifnot

(ord

('0'

)<= code <=

ord(

'9')

orord

('a'

)<= code <=

ord(

'f')

orord

('a'

)<= code <=

ord(

'f')):

return

"neither"

return

"ipv6"

return

"neither"

468 驗證IP位址

編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址172.16.254.01是不合法的。ipv6...

468 驗證IP位址

編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。i...

468 驗證IP位址

編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。i...