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

17

Я пытаюсь проверить, соответствует ли вход 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+.

Готовы ли вы принять 999.999.999.999 как "действительный"? Айпи адрес? :) Maria Zverina
Только IPv4; нет IPv6? belacqua

Ваш Ответ

11   ответов
5

Я сталкивался с той же ситуацией, и мне был полезен ответ с использованием библиотеки сокетов, но он не обеспечивает поддержку адресов 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')
Это вернет 0.0.0.0 также
@rakeshpatanga, да, это действительный IP-адрес.
0
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")
3

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

-1
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'.

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

20

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

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

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

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

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

  1. 255 ---> 250-255
  2. 249 ---> 200-249
  3. 199 ---> 100-199
  4. 99 ---> 10-99
  5. 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")
    

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

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

Это работает для 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"
30

Использование регулярных выражений для проверки 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
Regex может работать, но ваш подход лучше.
@Speedbird - ОП указывает проверку IP-адреса в sys.argv. Поэтому я считаю, что регулярное выражение не является правильным выбором. Я согласен, что если вам нужно обработать большой файл / БД, регулярное выражение будет хорошим выбором. :)
@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 их..
Подход с использованием сокетов возвращает истину для адреса = '0,33'!
+1 от меня тоже за этот подход (проголосовал час назад или около того :)
12

регулярное выражение для 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 и т. д.

Вот Это Да! Я думаю, что я буду придерживаться метода сокетов, спасибо ... хотя я на самом деле приму это к сведению ... Мне было интересно, как это будет выглядеть. :-) MHibbin
0
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}$',s)
if m is not None:
    print "Valid sequence of input"
else :
    print "Invalid input sequence"

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

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