Использование регулярного выражения для извлечения имени файла из файла журнала, используя Python - PullRequest
0 голосов
/ 31 марта 2020

ищет создать список файлов, доступ к которым из файла журнала. Два примера строк из файла показаны ниже.

.... [08 / Mar / 2020: 19: 11: 15 -0700] "GET / socview / 15Ragged.htm HTTP / 1.1" 200 6564 ..... ....

.... [08 / Mar / 2020: 19: 11: 31 -0700] "GET / socview /? C = D; O = A HTTP / 1.1 "200 13443 ..............

/ socview / 15Ragged.htm - вот что я хочу извлечь ie. заканчиваясь на .htm .log .txt et c.

/ socview /? C = D; O = A - это то, что я пытаюсь избежать извлечения.

Кажется, что "." это вызывает проблемы, например, когда я запускаю код без его поиска, ie. RE ниже прекрасно работает как часть l oop, показанного внизу этого поста.

unique = re.search(r'GET (\S+)', x)

Однако это извлечение строк, которые я не хочу. Ниже я пытаюсь использовать l oop и RE, это имеет смысл для меня, и я не могу понять, что не так, когда запускается, отображается сообщение ниже. Любая помощь будет принята с благодарностью

", если unique.group (1) отсутствует в unilist:

AttributeError: у объекта 'NoneType' нет атрибута 'group' '

for x in input:
     unique = re.search(r'GET (\S+\.\S+)', x)

     if unique.group(1) not in unilist:
           unilist.append(unique.group(1))

1 Ответ

0 голосов
/ 31 марта 2020

GET (\S+\.\S+) в порядке. Проблема в том, что re.search() возвращает None, если совпадение не удалось, поэтому для второй предоставленной вами строки unique - это None, у которой нет свойства group.

Попробуйте следующее:

for x in input:
    unique = re.search(r'GET (\S+\.\S+)', x)

    if unique is None:
        continue

    if unique.group(1) not in unilist:
           unilist.append(unique.group(1))

Я рекомендую вам использовать более подходящие имена переменных. Например, input является встроенным в Python, избегайте его теневого копирования. Если тело l oop будет расти, будет трудно следовать таким именам, как x.

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

matcher = re.compile("GET (\S+\.\S+)")

for line in lines:
    # your loop body here
...