Подтвердить что ты не робот

Использование 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+.

4b9b3361

Ответ 1

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

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

потому что . является подстановочным знаком, обозначающим "каждый символ"

Ответ 2

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

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

Ответ 3

regex для 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 и т.д.

Ответ 4

Я столкнулся с той же ситуацией, я нашел ответ с использованием библиотеки сокетов полезной, но не поддерживает поддержку адресов 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')

Ответ 5

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

Ответ 6

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

Ответ 7

Здесь вариант, совместимый с IPv4/6, для одного и того же:

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

Это будет соответствовать адресам IPv4 и IPv6. Изменение - это (\.\d{1,3}\.\d{1,3})? и будет соответствовать тем дополнительным .xx.xx, если они есть.

Ответ 8

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. Проверка того, является ли его двоичное число, хотя и не требуется. Надеюсь, вам понравится.

Ответ 9

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

Ответ 10

Если вы действительно хотите использовать RegEx, следующий код может фильтровать недопустимые IP-адреса в файле, независимо от организации файла, по одному или более на строку, даже если есть больше текста (сама концепция RegEx):

def getIps(filename):
    ips = []
    with open(filename) as file:
        for line in file:
            ipFound = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$").findall(line)
            hasIncorrectBytes = False
            try:
                    for ipAddr in ipFound:
                        for byte in ipAddr:
                            if int(byte) not in range(1, 255):
                                hasIncorrectBytes = True
                                break
                            else:
                                pass
                    if not hasIncorrectBytes:
                        ips.append(ipAddr)
            except:
                hasIncorrectBytes = True

    return ips

Ответ 11

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

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

Ответ 12

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 

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

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

Ответ 13

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

Ответ 14

yourip = '10.10.10.10'

if [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',yourip).group(0))].count(True)==4:

    print "valid ip"

else:

    print "invalid ip"