Как реализовать алгоритм фильтрации адреса IPv4 без регулярного выражения?

Мне нужно реализовать алгоритм фильтрации IPv4-адреса. Должна работать с нотациями десятичная дробь, шестнадцатеричный, восьмеричный, с точками и без. Кроме того, Я не могу использовать регулярное выражение.

Примеры:

  1. 192.0.2.235 возврат Истинный
  2. 0xC0.0x00.0x02.0xEB возвращает Истинный
  3. 256.256.256.256 возврат Ложь
  4. 0300.0000.0002.0353 возврат Истинный
  5. 0xC00002EB возвращает Истинный
  6. 3221226219 возврат Истинный
  7. 030000001353 возврат Истинный

Я пытаюсь сделать код, как показано ниже, но он не работает для всех примеров.

    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')) 

Любой совет?

Можете ли вы показать нам как, что вы используете этот код и какие примеры не работают? Вы также должны исправить отступ, потому что код, который вы дали, не работает.

apilat 30.05.2019 18:24

Он хочет это: gist.github.com/kkirsche/2e2d6d1dd8c6d27c3a7e, но без регулярного выражения :)

filipe 30.05.2019 19:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первое, что приходит на ум:

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

Здорово! Спасибо!

user11045254 31.05.2019 09:11

Другие вопросы по теме