Как проверить IP-адрес в Python? [Дубликат]

На боковой ноте msvcrt.kbhit () возвращает логическое значение, определяющее, нажата ли в данный момент клавиша на клавиатуре.

Итак, если вы делаете игру или что-то еще и хотите, чтобы нажатия клавиш делали что-то, но не останавливали игру целиком, вы можете использовать kbhit () внутри оператора if, чтобы убедиться, что ключ только извлекается, если пользователь действительно хочет что-то сделать.

Пример в Python 3:

# this would be in some kind of check_input function
if msvcrt.kbhit():
    key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
    if key == "w": # here 'w' is used as an example
        # do stuff
    elif key == "a":
        # do other stuff
    elif key == "j":
        # you get the point
144
задан chills42 25 November 2008 в 23:42
поделиться

4 ответа

Не анализируйте его. Просто спросите.

import socket

try:
    socket.inet_aton(addr)
    # legal
except socket.error:
    # Not legal
171
ответ дан Dustin 25 November 2008 в 23:42
поделиться

модуль IPy (модуль, разработанный для контакта с IP-адресами), выдаст исключение ValueError для недопустимых адресов.

>>> from IPy import IP
>>> IP('127.0.0.1')
IP('127.0.0.1')
>>> IP('277.0.0.1')
Traceback (most recent call last):
 ...
ValueError: '277.0.0.1': single byte must be 0 <= byte < 256
>>> IP('foobar')
Traceback (most recent call last):
 ...
ValueError: invalid literal for long() with base 10: 'foobar'

Однако как ответ Dustin, это примет вещи как "4" и "192.168" с тех пор, как упомянуто, это допустимые представления IP-адресов.

при использовании Python 3.3 или позже он теперь включает ipaddress модуль :

>>> import ipaddress
>>> ipaddress.ip_address('127.0.0.1')
IPv4Address('127.0.0.1')
>>> ipaddress.ip_address('277.0.0.1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/ipaddress.py", line 54, in ip_address
    address)
ValueError: '277.0.0.1' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.ip_address('foobar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/ipaddress.py", line 54, in ip_address
    address)
ValueError: 'foobar' does not appear to be an IPv4 or IPv6 address

Для Python 2, можно получить ту же функциональность с помощью ipaddress при установке python-ipaddress:

pip install ipaddress

Этот модуль совместим с Python 2 и предоставляет очень похожий API тому из ipaddress модуля, включенного в Библиотеку Стандарта Python начиная с Python 3.3. Больше деталей здесь . В Python 2 необходимо будет явно преобразовать строку IP-адреса в unicode: ipaddress.ip_address(u'127.0.0.1').

60
ответ дан rbaleksandar 25 November 2008 в 23:42
поделиться
  • 1
    Необходимо добавить тему с кодом View::addNamespace('theme', '/path/to/themes/default'); тогда использование это с кодом return View::make('theme::view.name'); – lu cip 23 September 2013 в 08:54

Я думаю, что это сделало бы это...

def validIP(address):
    parts = address.split(".")
    if len(parts) != 4:
        return False
    for item in parts:
        if not 0 <= int(item) <= 255:
            return False
    return True
6
ответ дан chills42 25 November 2008 в 23:42
поделиться
  • 1
    @MichaelStramel После долгого времени сообщение обновляется. – devo 10 March 2014 в 12:04
def is_valid_ip(ip):
    """Validates IP addresses.
    """
    return is_valid_ipv4(ip) or is_valid_ipv6(ip)

IPv4:

def is_valid_ipv4(ip):
    """Validates IPv4 addresses.
    """
    pattern = re.compile(r"""
        ^
        (?:
          # Dotted variants:
          (?:
            # Decimal 1-255 (no leading 0's)
            [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
          |
            0x0*[0-9a-f]{1,2}  # Hexadecimal 0x0 - 0xFF (possible leading 0's)
          |
            0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's)
          )
          (?:                  # Repeat 0-3 times, separated by a dot
            \.
            (?:
              [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
            |
              0x0*[0-9a-f]{1,2}
            |
              0+[1-3]?[0-7]{0,2}
            )
          ){0,3}
        |
          0x0*[0-9a-f]{1,8}    # Hexadecimal notation, 0x0 - 0xffffffff
        |
          0+[0-3]?[0-7]{0,10}  # Octal notation, 0 - 037777777777
        |
          # Decimal notation, 1-4294967295:
          429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}|
          42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|
          4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8}
        )
        $
    """, re.VERBOSE | re.IGNORECASE)
    return pattern.match(ip) is not None

IPv6:

def is_valid_ipv6(ip):
    """Validates IPv6 addresses.
    """
    pattern = re.compile(r"""
        ^
        \s*                         # Leading whitespace
        (?!.*::.*::)                # Only a single whildcard allowed
        (?:(?!:)|:(?=:))            # Colon iff it would be part of a wildcard
        (?:                         # Repeat 6 times:
            [0-9a-f]{0,4}           #   A group of at most four hexadecimal digits
            (?:(?<=::)|(?<!::):)    #   Colon unless preceeded by wildcard
        ){6}                        #
        (?:                         # Either
            [0-9a-f]{0,4}           #   Another group
            (?:(?<=::)|(?<!::):)    #   Colon unless preceeded by wildcard
            [0-9a-f]{0,4}           #   Last group
            (?: (?<=::)             #   Colon iff preceeded by exacly one colon
             |  (?<!:)              #
             |  (?<=:) (?<!::) :    #
             )                      # OR
         |                          #   A v4 address with NO leading zeros 
            (?:25[0-4]|2[0-4]\d|1\d\d|[1-9]?\d)
            (?: \.
                (?:25[0-4]|2[0-4]\d|1\d\d|[1-9]?\d)
            ){3}
        )
        \s*                         # Trailing whitespace
        $
    """, re.VERBOSE | re.IGNORECASE | re.DOTALL)
    return pattern.match(ip) is not None

версия IPv6 использует" (?:(?<=::)|(?<!::):)", который мог быть заменен" (?(?<!::):)" на regex механизмах, которые поддерживают условные выражения со взглядом-arounds. (т.е. PCRE.NET)

Редактирование:

  • Отброшенный собственный вариант.
  • Расширенный regex для исполнения RFC.
  • Добавленный другой regex для адресов IPv6.

Edit2:

я нашел некоторое обсуждение ссылок, как проанализировать адреса IPv6 с regex:

Edit3:

Наконец сумел записать шаблон, который проходит все тесты, и что я также доволен.

43
ответ дан Markus Jarderot 25 November 2008 в 23:42
поделиться
  • 1
    Это означает, что Ваш путь: приложение (' path').'/../themes/default' – lu cip 23 September 2013 в 09:53
Другие вопросы по тегам:

Похожие вопросы: