Если предложение / else для оператора цикла с re.search не работает (python) - PullRequest
2 голосов
/ 12 апреля 2019

Я хочу проанализировать строки файла и получить IP-адреса.
Я использую re.search и хочу напечатать оба:
- IP-адреса
- строка «Нет», когда нетIP

Учитывая, что файл соответствует переменной logfile, я написал следующий фрагмент:

import re, sys

regexip = r'(?!91.134.143.128)[0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}'
logfile = '91.12.13.14, 65.12.45.78, aaa'

my_iplist = re.findall(regexip,logfile)
for ii in my_iplist:
    if re.search (regexip,logfile):
        print ii
    else:
        print 'None'

Проблема в том, что я получаю только эти результаты ...

91.12.13.14
65.12.45.78

... тогда как я хочу иметь:

91.12.13.14
65.12.45.78
Нет

Это другое утверждение не работает.Я полагаю, что я что-то не так делаю, но я не знаю, что это такое.
Любая помощь будет очень признательна.
Спасибо!

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Прежде всего, используйте r'(?<![0-9])(?: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]?)){3}(?![0-9])' для фактического соответствия действительных IP-адресов . Вы можете отфильтровать «нежелательный» IP, как только у вас есть совпадение.

Теперь, если у вас один IP-адрес в строке, используйте re.search вот так

import sys, re

regexip = r'(?<![0-9])(?: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]?)){3}(?![0-9])'
result = []
with open(your_log_file_path, 'r') as f:
    for line in f:
        m = re.search(regexip, line)
        if not m:
            result.append(None)
        else:
            if m.group() != "91.134.143.128":
                result.append(m.group())
            else:
                result.append(None)

Если у вас есть несколько нежелательных IP-адресов, определите их в списке:

uwelcome_ips = ["91.134.143.128", "91.134.143.129"]

, а затем

if m.group() not in uwelcome_ips:
1 голос
/ 12 апреля 2019

else никогда не будет выполнено, потому что my_iplist содержит только действительные IP-адреса. re.findall вернет все совпадения. Все строки, которые не совпадают, не будут возвращены.

Чтобы получить желаемый результат, вам нужно разделить строку на ", ", а затем проверить каждое на соответствие регулярному выражению:

lines = logfile.split("\n")
nested_ips = map(lambda x: x.split(", "), lines)
ips = reduce(list.__add__, nested_ips)
for ii in ips:
    if re.search (regexip,ii):
        print ii
    else:
        print 'None'

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

regexip = r'^(?!91.134.143.128)[0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}$'
0 голосов
/ 12 апреля 2019

re.findall не сохраняет непревзойденные вещи, поэтому вам придется проверять построчно:

for i in logfile.split(','):
    match = re.search(regexip, i)
    if match: 
        print match.group(0)
    else: 
        print "None"

Поскольку ваш файл журнала является файлом, вы можете вместо этого зациклить строки:

for line in open("logfile.log", "r"):
    match = re.search(regexip, line.strip())
    if match:
        print match.group(0)
     else:
        print "None"

Вот как выглядит мой logfile.log файл:

91.12.13.14ezrtqsyu
65.12.45.78 aert
aaa

И вывод:

91.12.13.14
65.12.45.78
None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...