Использование RegEx для сопоставления IP-адресов в Python

Я пытаюсь проверить, соответствует ли вход sys.argv RegEx для IP-адреса ...

В качестве простого теста у меня есть следующее ...

import re

pat = re.compile("\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}")
test = pat.match(hostIP)
if test:
   print "Acceptable ip address"
else:
   print "Unacceptable ip address"

Однако, когда я передаю в него случайные значения, он возвращает «Приемлемый IP-адрес». в большинстве случаев, кроме случаев, когда у меня есть «адрес»; это в основном эквивалентно\d+.

 belacqua29 июн. 2012 г., 17:16
Только IPv4; нет IPv6?
 Maria Zverina29 июн. 2012 г., 17:15
Готовы ли вы принять 999.999.999.999 как "действительный"? Айпи адрес? :)
 belacqua29 июн. 2012 г., 17:17

Ответы на вопрос(11)

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

К сожалению, это работает только для python3

import ipaddress

def valid_ip(address):
    try: 
        print ipaddress.ip_address(address)
        return True
    except:
        return False

print valid_ip('10.10.20.30')
print valid_ip('2001:DB8::1')
print valid_ip('gibberish')
 27 окт. 2017 г., 08:58
@rakeshpatanga, да, это действительный IP-адрес.
 15 окт. 2017 г., 15:07
Это вернет 0.0.0.0 также

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

Использование регулярных выражений для проверки IP-адреса - плохая идея - 999.999.999.999 считается допустимым. Попробуйте этот подход, используя вместо этого сокет - гораздо лучшая проверка и такая же простая, если не проще сделать.

import socket

def valid_ip(address):
    try: 
        socket.inet_aton(address)
        return True
    except:
        return False

print valid_ip('10.10.20.30')
print valid_ip('999.10.20.30')
print valid_ip('gibberish')

Если вы действительно хотите использовать вместо этого подход parse-the-host, этот код сделает это точно:

def valid_ip(address):
    try:
        host_bytes = address.split('.')
        valid = [int(b) for b in host_bytes]
        valid = [b for b in valid if b >= 0 and b<=255]
        return len(host_bytes) == 4 and len(valid) == 4
    except:
        return False
 21 сент. 2013 г., 01:23
Подход с использованием сокетов возвращает истину для адреса = '0,33'!
 29 июн. 2012 г., 19:32
+1 от меня тоже за этот подход (проголосовал час назад или около того :)
 29 июн. 2012 г., 17:18
Regex может работать, но ваш подход лучше.
 08 мар. 2014 г., 05:31
@Maria - я полагаю, что ключом здесь является «соответствие»; IP-адреса, например: & quot; Вот этот файл на 10 терабайт / БД,match или жеlist IP-адреса, которые вы можете найти & quot ;, а не & quot;create a function that receives a string and returns whether it is an IP address"следовательно, для меня решение состоит в том, чтобы использовать хорошо продуманное регулярное выражение, столько, сколько мыhate их..
 01 авг. 2014 г., 17:39
@Speedbird - ОП указывает проверку IP-адреса в sys.argv. Поэтому я считаю, что регулярное выражение не является правильным выбором. Я согласен, что если вам нужно обработать большой файл / БД, регулярное выражение будет хорошим выбором. :)
import re

st1 = 'This is my IP Address10.123.56.25 789.356.441.561 127 255 123.55 192.168.1.2.3 192.168.2.2 str1'

Здесь мой действительный IP-адрес только192.168.2.2 и предполагая10.123.56.25 не является допустимым, поскольку он объединяется с некоторой строкой и192.168.1.2.3 недействительный.

pat = r'\s(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\s|$))'

match = re.search(pat,st1)

print match.group()

================ RESTART: C:/Python27/Srujan/re_practice.py ================
192.168.2.2 

Это позволит получить точный IP-адрес, мы можем игнорировать любой шаблон, похожий на IP-адрес, но не действительный. Пример:'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3'.

Пожалуйста, прокомментируйте, если какие-либо изменения требуются.

def ipcheck():
# 1.Validate the ip adderess
input_ip = input('Enter the ip:')
flag = 0

pattern = "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$"
match = re.match(pattern, input_ip)
if (match):
    field = input_ip.split(".")
    for i in range(0, len(field)):
        if (int(field[i]) < 256):
            flag += 1
        else:
            flag = 0
if (flag == 4):
    print("valid ip")
else:
    print('No match for ip or not a valid ip')

IP-адрес использует следующую аутентификацию:

255 ---> 250-255 249 ---> 200-249 199 ---> 100-199 99 ---> 10-99

9 ---> 1-9

import re    
k = 0
while k < 5 : 
    i = input("\nEnter Ip address : ")
    ip = re.match("^([1][0-9][0-9].|^[2][5][0-5].|^[2][0-4][0-9].|^[1][0-9][0-9].|^[0-9][0-9].|^[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9]|[2][5][0-5]|[2][0-4][0-9]|[1][0-9][0-9]|[0-9][0-9]|[0-9])$",i)
    k = k + 1 
    if ip:
        print ("\n=====================")
        print ("Valid IP address")
        print ("=====================")
        break
    else :
        print ("\nInvalid IP")
else :
    print ("\nAllowed Max 5 times")

Ответьте мне, если у вас есть сомнения?

import re
ipv=raw_input("Enter an ip address")
a=ipv.split('.')
s=str(bin(int(a[0]))+bin(int(a[1]))+bin(int(a[2]))+bin(int(a[3])))
s=s.replace("0b",".")
m=re.search('\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}

Просто для простоты я использовал этот подход. Просто, чтобы объяснить, как на самом деле оценивается адрес ipv4. Проверка, является ли его двоичное число хотя не обязательным. Надеюсь, вам понравится это.

,s) if m is not None: print "Valid sequence of input" else : print "Invalid input sequence"

Просто для простоты я использовал этот подход. Просто, чтобы объяснить, как на самом деле оценивается адрес ipv4. Проверка, является ли его двоичное число хотя не обязательным. Надеюсь, вам понравится это.

Это работает для Python 2.7:

import re
a=raw_input("Enter a valid IP_Address:")
b=("[0-9]+"+".")+"{3}"
if re.match(b,a) and b<255:
    print "Valid"
else:
    print "invalid"
str = "255.255.255.255"
print(str.split('.'))

list1 = str.split('.')

condition=0

if len(list1)==4:
    for i in list1:
        if int(i)>=0 and int(i)<=255:
            condition=condition+1

if condition!=4:
    print("Given number is not IP address")
else:
    print("Given number is valid IP address")
Решение Вопроса

Вы должны изменить свое регулярное выражение следующим образом

pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")

это потому что. подстановочный знак, который обозначает «каждый символ»;

 30 мая 2015 г., 18:48
Это не работает. он также фильтрует это - 2.16.840.1, который не может быть ip
 29 июн. 2012 г., 16:55
Также, чтобы убедиться, что строка в точности соответствует указанному, вы можете добавить^ быть началом и$ к концу. В противном случае возможно совпадение со строкой вроде10.0.0.1:1234 где вы этого не хотите.
 29 июн. 2012 г., 17:02
Добро пожаловать ... Ошибки случаются :)
 29 июн. 2012 г., 17:06
КСТАТИ: префикс строки также с r, это хорошая привычка:r"^\d{1,3}..."
 24 янв. 2014 г., 16:09
Ребята, это не работает ... проверьте это, прежде чем дать "зеленую галочку". 255.255.255.256 терпит неудачу, и так далее ..

регулярное выражение для IP v4:

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

в противном случае вы принимаете недействительный IP-адрес, такой как 999.999.999.999, 256.0.0.0 и т. д.

 MHibbin01 июл. 2012 г., 11:44
Вот Это Да! Я думаю, что я буду придерживаться метода сокетов, спасибо ... хотя я на самом деле приму это к сведению ... Мне было интересно, как это будет выглядеть. :-)

Ваш ответ на вопрос