Проверка IP Python Проверка REGex для полных и частичных IP - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь проверить ввод, чтобы увидеть, если это действительный IP-адрес (может быть частичным).

Допустимый ввод: 172, 172.112, 172.112.113, 172.112.113.114

Недопустимый ввод: 1724,172.11113 и т. Д. И т. Д.

Вот функция, которую я создал для проверки (однако он подтверждает недопустимый ввод, такой как 1724, который я не могу исправить .. пожалуйста, помогите)

def ipcheck(ip):
    ippattern_str = '(([1-2]?[\d]{1,2}\.?){0,1}(\.[1-2]?[\d]{1,2}){0,1}(\.[1-2]?[\d]{1,2}\.){0,1}(([1-2]?[\d]{1,2}[\D\W]*)'
    ippattern = re.compile(ippattern_str)
    # ippattern is now used to call match, passing only the ip string
    global matchip
    matchip = ippattern.match(ip)
    return matchip


ip = sys.argv[1]
ipcheck(ip)

print matchip

Я чувствую, что, возможно, мне нужно правильно использовать якоря?Я попробовал все, насколько мне известно, любая помощь будет оценена.

Ответы [ 2 ]

7 голосов
/ 25 ноября 2011

Может быть, вы могли бы избежать использования регулярных выражений и позволить Python socket.inet_aton делать работу:

import socket

try:
    socket.inet_aton(addr)
    # correct IP
except socket.error:
    # bad IP

Для inet_aton действительный IP-адрес имеет вид:

       a.b.c.d
       a.b.c
       a.b
       a

Во всех вышеперечисленных формах компоненты точечного адреса могут быть указывается в десятичном, восьмеричном (с лидирующим 0) или шестнадцатеричном, с ведущий 0X). Адреса в любой из этих форм совместно называются Обозначение цифр и точек IPV4. Форма, которая использует ровно четыре десятичные числа называются точечно-десятичными обозначениями IPv4 (или иногда: запись в формате IPv4 с точками и квадратами).

источник

2 голосов
/ 25 ноября 2011

Это регулярное выражение сделает свое дело:

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){0,3}$

Это гарантирует, что заданные числа находятся в правильном диапазоне (0-255) и могут состоять из 1-4 частей.

Вы можете увидеть это в действии здесь: http://regexr.com? 2va3j

...