LINUX.ORG.RU

Регулярка для разбора лога

 


0

1

Тренируюсь в разбора логов на питоне и поставила меня в тупик ситуация с модификаторами повторения
Надо сматчить названия name1,name2,name3,name4 в следующем случае

	 [Id] = 123
	 строка
	 строка
	 строка
	 строка
	 строка
	 строка
	 [Number] = {total(4)}
	 [Element 1]- one = 1
	 [Element 1]- two = name1
	 [Element 2]- one = 3
	 [Element 2]- two = name2
	 [Element 3]- one = 5
	 [Element 3]- two = name3
	 [Element 4]- one = 14
	 [Element 4]- two = name4

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

\[Id\] = 123\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*(\[Element [0-9]\]\- first.*\n.*\[Element [0-9]\]\- second = (.*)){1,}
Но так не взлетело. Как это сделать по уму?

★★★★★

Ответ на: комментарий от vurdalak

Отличаются Id, их я знаю и пробегаю в цикле подставляя в регексп.
Варианты тут только с набором элементов (Element)
То есть последняя часть выглядит так:

	 [Element 1]- one = 1
	 [Element 1]- two = name1
         ...
	 [Element N]- one = тут_какое_то_число
	 [Element N]- two = nameN
N от одного до 30, скажем

zolden ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Тут ньюанс в том что набор name уникален для Id(которых несколько), поэтому надо привязываться к Id. 123 там был в качестве примера

zolden ★★★★★
() автор топика

Я, наверное, не очень понял,что ты хочешь сделать, но вот такой вариант не подойдет?

[l.split(' = ')[2] for l in re.findall('\[Element\ \d+\].*\n\[Element\ \d+\].*', text)]

anonymous
()

Как это сделать по уму?

systemd и бинарные логи.

anonymous
()
Ответ на: комментарий от anonymous

Вот наговнокодил вариант с привязкой к Id = 123:

[l.split(' = ')[1] for l in re.sub('\[Id\] = 123\n(.*\n)*\[Number\].*\n(\[Element\ \d+\].*\n\[Element\ \d+\].*)*', '\g<2>', text).split('\n') if len(l.strip()) > 0][1::2]
Я бы вращил себе по щщям, если бы увидел, что я такое написал.

anonymous
()

Надо сматчить названия

Из этого совершенно непонятно, что на самом деле тебе надо.

[Element 2]- two
[Element [0-9]\]\- second

Либо определись, либо без ИИ никак.

Deleted
()

Софтина, пишущая в этот лог, многопоточная?
Если да, то все попытки сматчить многострочные конструкции в логе пойдут насмарку, как только что-то писанёт посреди такой конструкции каким-нибудь другим ивентом.

Попробуй сначала написать прототип такого матчинга на awk с построчной обработкой. Тогда и станет понятно, как должен будет выглядеть код на питоне.

blexey ★★★★★
()
Ответ на: комментарий от Deleted

Из этого совершенно непонятно


Надо сматчить строки после знака = в строках вида
[Element N]- two = вотэтустроку

zolden ★★★★★
() автор топика
Последнее исправление: zolden (всего исправлений: 2)
Ответ на: комментарий от blexey

Не хочу заморачиваться обработкой ошибок, просмотрев кучу логов не нашёл отклонений. Пока сделал по тупому склейкой паттерна матчинга в зависимости от [Number] = {total(4)} но хотелось бы расти над собой и понять как матчить повторения с помощью квантификатора

zolden ★★★★★
() автор топика
Ответ на: комментарий от HeipaVai1o

Если есть способ проще/оптимальнее, то я его с радостью послушаю.
Формат входных и выходных данных понятен или нужны уточнения?

zolden ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.