方法:使用模組
正規表示式,該方法效能不太好
分治法,效率最高的方法之一
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...