Читать многострочный журнал с регулярным выражением, используя python - PullRequest
1 голос
/ 06 марта 2019

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

2019-01-10 10:33:21 +07 dvdrentalLOG: statement:  SELECT last_update 
    From public.actor
2019-03-06 14:07:06 +07 dvdrentalLOG:  statement: SELECT film_id, title
    FROM public.film
    WHERE film_id = 1

Я хочу получить запросы с использованием цикла.желаемый вывод:

query1 : SELECT last_update From public.actor
query2 : SELECT film_id, title FROM public.film WHERE film_id = 1

Это я пробовал:

import re
def parseFile(filepath):
    line=[]
    with open(filepath,'r') as log:
        regex = re.compile(r'(\d{4}-\d{2}-\d{2})(.*)',re.MULTILINE|re.DOTALL)
        for line in log:
            date = regex.findall(line)
            if date == []:
                print()
            else:
                print(date)

filepath = 'text.txt'
parseFile(filepath)

output:
 [('2019-01-10', ' 10:33:21 +07 dvdrentalLOG: statement:  SELECT last_update \n')]
 [('2019-03-06', ' 14:07:06 +07 dvdrentalLOG:  statement: SELECT film_id, title\n')]

вывод не выбрать все запросы.что мне делать?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы обрабатываете только одну строку за раз (через цикл for line in log:), поэтому ваше регулярное выражение применяется только к одной строке за раз. Он не может совпадать между строками, потому что вы не даете ему несколько строк за раз для совпадения.

Вместо этого вы можете прочитать весь файл через log.read() и затем вызвать .findall для этого.

0 голосов
/ 06 марта 2019

Вы можете адаптировать свой код следующим образом (вам нужно прочитать весь файл перед его синтаксическим анализом; если вы читаете построчно, как вы это делали в своем коде, ваше регулярное выражение будет только анализировать строку за другой и никогда не сможет выделить все SQL-запросы, разбитые на несколько строк):

import re
def parseFile(filepath):
    line=[]
    with open(filepath,'r') as log:
        regex = re.compile(r'(\d{4}-\d{2}-\d{2})(.*?)(?=\d{4}-\d{2}-\d{2}|$)',re.MULTILINE|re.DOTALL)
        lines = re.sub('\n|\s{2,}',' ',log.read())#.replace('\n', '')
        date = regex.findall(lines)
        if date == []:
          print()
        else:
          print(date)

filepath = 'query.log'
parseFile(filepath)

выход:

[('2019-01-10', ' 10:33:21 +07 dvdrentalLOG: statement: SELECT last_update From public.actor '), ('2019-03-06', ' 14:07:06 +07 dvdrentalLOG: statement: SELECT film_id, title  FROM public.film  WHERE film_id = 1 ')]

Где регулярное выражение (с использованием положительного взгляда, чтобы ограничить число символов, совпадающих с .*?) подробно описано здесь: https://regex101.com/r/nE0omm/1/

(\d{4}-\d{2}-\d{2})(.*?)(?=\d{4}-\d{2}-\d{2}|$)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...