leetcode驗證ip位址 468

2021-10-08 20:00:09 字數 2821 閱讀 8447

方法:使用模組

正規表示式,該方法效能不太好

分治法,效率最高的方法之一

from ipaddress import ip_address, ipv6address

# 該模組認為如果ipv4位址包含前置0,則位址是有效的

defvalid_ip_address

(ip:

str)

->

str:

try:

return

"ipv6"

iftype

(ip_address(ip)

)is ipv6address else

"ipv4"

except valueerror:

return

"neither"

使用正規表示式匹配ipv4的邏輯如下,注意不允許有前置0出現.

一共五種情況:

塊只包含一位數字,範圍是0-9

塊包含兩位數字,第一位的範圍是1到9,第二位是0到9

塊包含三位數字,且第一位為1.第

二、三位可以是0到9

塊包含三位數字,且第一位為2,第二位為0-4.那麼第三位可以是0到9

塊包含三位數字,且第一位為2,第二位為5,那麼第三位可以是0到5

使用相同邏輯可以構造匹配ipv6位址的正規表示式

import re

defvalid_ip_address

(ip:

str)

->

str:

chunk_ipv4 = r'([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'

pattern_ipv4 = re.

compile

(r'^('

+ chunk_ipv4 + r'\.)'

+ chunk_ipv4 + r'$'

) chunk_ipv6 = r'([0-9a-fa-f])'

pattern_ipv6 = re.

compile

(r'^('

+ chunk_ipv6 + r'\:)'

+ chunk_ipv6 + r'$')if

'.'in ip:

return

"ipv4"

if pattern_ipv4.match(ip)

else

'neither'

if':'

in ip:

return

"ipv6"

if pattern_ipv6.match(ip)

else

'neither'

return

'neither'

ipv4和ipv6位址均是由特定的分界符隔開的字串組成,並且每個子字串具有相同

格式對於ipv4位址,通過界定符,將位址分為四塊;對於ipv6位址,通過界定符,將位址分為八塊

對於ipv4位址的每一塊,檢查它們是否在0-255內,且沒有前置0

對於ipv6位址的每一塊,檢查其長度是否為1-4位的十六進製制數

def

validate_ipv4

(ip:

str)

->

str:

nums = ip.split(

'.')

for x in nums:

# validate integer in range(0, 255)

# 1. length of chunk is between 1 and 3

iflen

(x)==0or

len(x)

>3:

return

'neither'

# 2. no extra leading zeros

# 3. only digits are allowed

# 4. less than 255

if x[0]

=='0'

andlen

(x)!=1or

not x.isdigit()or

int(x)

>

255:

return

'neither'

return

"ipv4"

defvalidate_ipv6

(ip:

str)

->

str:

nums = ip.split(

':')

hexdigits =

'0123456789abcdefabcdef'

for x in nums:

iflen

(x)==0or

len(x)

>4or

notall

(c in hexdigits for c in x)

:return

'neither'

return

"ipv6"

defvalid_ip_address

(ip:

str)

->

str:

if ip.count(

'.')==3

:return validate_ipv4(ip)

elif ip.count(

':')==7

:return validate_ipv6(ip)

else

:return

'neither'

LeetCode 驗證IP位址

ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。ipv6 位址由8組16進製制的數字來表示,每組表示 16 位元。這些組數...

leetcode468 驗證IP位址

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

驗證IP位址

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