Мне нужно реализовать алгоритм фильтрации IPv4-адреса. Должна работать с нотациями десятичная дробь, шестнадцатеричный, восьмеричный, с точками и без. Кроме того, Я не могу использовать регулярное выражение.
Примеры:
Я пытаюсь сделать код, как показано ниже, но он не работает для всех примеров.
def convertor(s):
s = s.split('.')
if len(s) != 4:
return False
for i in s:
if not i.isdigit():
i = int(i,16)
list.append(i)
else:
if int(i) < 0 and int(i) > 255:
print('This is not correct IPv4')
return False
else:
i = int(i)
list.append(i)
print('This is correct IPv4')
return list
def convert(ip):
n = 4
ip = str(int(ip,32))
ip = [ip[i:i+n] for i in range(0, len(ip),n)]
return convertor(ip)
print(convert('3221226219'))
Любой совет?
Он хочет это: gist.github.com/kkirsche/2e2d6d1dd8c6d27c3a7e, но без регулярного выражения :)
Первое, что приходит на ум:
MAX_DEC = 4294967295
MAX_QUAD_DEC = 255
def is_quad_ip(ip):
"""
Validates IPs in quad decimal, octal and hexadecimal
Ex.
127.0.0.1
0x7f.0x0.0x0.0x1
:param ip: ip to validate
:type ip: string
:return: true if it is a valid ip in quad decimal, octal or hexadecimal; false otherwise
:type return: boolean
"""
ll = ip.split(".")
if len(ll) != 4:
return False
try:
is_dec = all([
0 <= int(x) <= MAX_QUAD_DEC
and (len(x) == 1 or (len(x) >= 2 and not x.startswith("0")))
for x in ll
])
except ValueError:
is_dec = False
try:
is_oct = all([
len(x) == 4
and 0 <= int(x, 8) <= MAX_QUAD_DEC
for x in ll
])
except ValueError:
is_oct = False
try:
is_hex = all([0 <= int(x, 16) <= MAX_QUAD_DEC for x in ll])
except ValueError:
is_hex = False
return is_dec or is_oct or is_hex
def is_ip(ip):
"""
Validates IPs either in quad notation or not
Ex.
127.0.0.1 (QUAD DECIMAL)
2130706433 (DECIMAL)
:param ip: ip to validate
:type ip: string
:return: true if it is a valid ip; false otherwise
:type return: boolean
"""
if is_quad_ip(ip):
return True
try:
is_dec = 0 <= int(ip) <= MAX_DEC
except ValueError:
is_dec = False
try:
is_oct = 0 <= int(ip, 8) <= MAX_DEC
except ValueError:
is_oct = False
try:
is_hex = 0 <= int(ip, 16) <= MAX_DEC
except ValueError:
is_hex = False
return is_dec or is_oct or is_hex
print(is_ip("192.0.2.235"))
print(is_ip("0xC0.0x00.0x02.0xEB"))
print(is_ip("256.256.256.256"))
print(is_ip("0300.0000.0002.0353"))
print(is_ip("0xC00002EB"))
print(is_ip("3221226219"))
print(is_ip("030000001353"))
Возвращает:
True
True
False
True
True
True
True
Здорово! Спасибо!
Можете ли вы показать нам как, что вы используете этот код и какие примеры не работают? Вы также должны исправить отступ, потому что код, который вы дали, не работает.