题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
python3
刚开始忽略了题目中的说明,一直通过不了
说明:
import re
def is_right_ip(ip):
if not ip:
return False
pattern = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
mach = pattern.match(ip)
if not mach:
return False
nums = ip.split('.')
for num in nums:
if int(num)<0 or int(num)>255:
return False
else:
return True
def is_right_mask(mask):
if not mask:
return False
if mask == '0.0.0.0' or mask =='255.255.255.255':
return False
else:
m = ''.join(map(lambda x: bin(int(x))[2:].zfill(8),mask.split('.')))
last_one = m.rfind('1')
first_zero = m.find('0')
if last_one > first_zero:
return False
else:
return True
def is_personal_ip(ip):
if not ip:
return False
else:
nums = ip.split('.')
if int(nums[0]) == 10:
return True
if int(nums[0]) == 172 and 16<=int(nums[1])<=31:
return True
if int(nums[0]) == 192 and int(nums[1])==168:
return True
else:
return False
def is_type(ip):
if not ip:
return False
else:
nums = ip.split('.')
if 1<=int(nums[0])<=126:
return 'A'
if 128<=int(nums[0])<=191:
return 'B'
if 192<=int(nums[0])<=223:
return 'C'
if 224<=int(nums[0])<=239:
return 'D'
if 240<=int(nums[0])<=255:
return 'E'
A,B,C,D,E,EOR,P = 0,0,0,0,0,0,0
while True:
try:
ip,mask = input().split('~')
if not is_right_ip(ip) or not is_right_mask(mask):
nums = ip.split('.')
if int(nums[0]) == 0 or int(nums[0]) == 127:
continue
else:
EOR +=1
else:
if is_personal_ip(ip):
P +=1
if is_type(ip) == 'A':
A+=1
if is_type(ip) == 'B':
B+=1
if is_type(ip) == 'C':
C+=1
if is_type(ip) == 'D':
D+=1
if is_type(ip) == 'E':
E+=1
except:
break
print(f'{A} {B} {C} {D} {E} {EOR} {P}')