Подтвердить IP-адрес из списка

Я хотел бы проверить IP-адреса из списка, который может содержать неправильно отформатированные адреса или другой мусор. Если поле не содержит правильно отформатированного поля, просто продолжайте игнорировать это поле.

Согласно Как проверить IP-адрес в Python? кажется, что есть для этого используются два метода: REGEX или socket.inet_aton().

Ниже приведена попытка использовать socket.inet_aton() для анализа CSV и проверки поля, если это адрес IPv4. В настоящее время он печатает мусор или неправильно отформатированные IP-адреса. Любые советы по печати инверсии или IP-адреса, которые являются правильными IP-адресами?

Обновить

Числовые поля не печатаются в виде дискретных октетов, т. е. 12345 отпечатков. Как можно отфильтровать нотацию без октетов?

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
    except socket.error:
        continue
    print (data)

person Astron    schedule 30.03.2012    source источник
comment
Что именно не так, что вы пытаетесь исправить?   -  person kristaps    schedule 30.03.2012
comment
Я хотел бы, чтобы оператор print возвращал только действительные IP-адреса. В настоящее время он возвращает только недопустимые IP-адреса или мусор.   -  person Astron    schedule 30.03.2012
comment
Вы хотите распечатать его или вернуть? Это две совершенно разные вещи.   -  person kindall    schedule 30.03.2012
comment
Печать, обновление вопроса из отзыва ниже, хотя теперь я понимаю, что socket.inet_aton() будет соответствовать 111, 111.111 или 1111.111.111 111.111.111.111. Нужно убедиться, что это действительный IP, а не сокращение.   -  person Astron    schedule 30.03.2012
comment
12345 — это совершенно правильный IP-адрес, он просто записывается как одно 32-битное целое число, а не как дискретные октеты.   -  person kindall    schedule 31.03.2012
comment
Тогда мне нужен адрес в форме дискретного октета.   -  person Astron    schedule 31.03.2012


Ответы (4)


Предложение else блока try/except выполняется, если не возникло исключения.

try:
    socket.inet_aton(data)
except socket.error:
    pass
else:
    print(data)

Но поскольку вам требуется, чтобы он был выражен в виде дискретного октета, ваш лучший подход - это не регулярное выражение, не socket.inet_aton, а простая функция проверки:

def valid_ip(addr):
    try:
        addr = addr.strip().split(".")
    except AttributeError:
        return False
    try:
        return len(addr) == 4 and all(octet.isdigit() and int(octet) < 256
                                      for octet in addr)
    except ValueError:
        return False

Тогда это просто:

if valid_ip(data):
    print data
person kindall    schedule 30.03.2012
comment
valid_ip(-1.-1.-1.-1) == Верно? - person rakslice; 23.09.2013

Оператор печати находится в блоке «кроме», поэтому он вызывается только в случае ошибки при синтаксическом анализе переданной строки как IP-адреса.

Измените содержимое цикла for на это:

try:
    socket.inet_aton(data)
except socket.error:
    continue

print (data)
person kristaps    schedule 30.03.2012

Согласно руководству, inet_aton принимает строки с менее чем 3 точками:

inet_aton() также принимает строки, содержащие менее трех точек; подробности см. на странице руководства Unix inet(3).

Это может быть частью того, что происходит с вами здесь.

person AKX    schedule 30.03.2012

вы должны print сразу после вызова inet_aton():

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
        # data is ok, otherwise a socket.error would have been raised
        print(data)
    except socket.error:
        continue # if you don't care about "garbage"

всякий раз, когда inet_aton передается что-либо, что не является допустимым IP-адресом, socket.error повышается, и управление переходит к блоку except.

person michele b    schedule 30.03.2012