Python Regex - захват групп повторяющихся паттернов - PullRequest
1 голос
/ 25 октября 2019

У меня есть файл журнала, который я пытаюсь проанализировать. Пример файла журнала приведен ниже:

23 октября 13: 03: 03.714012 prod1_xyz (RSVV) [201]: # msgtype = EVENT # server = Web / Dev @ server1web # func = LKZ_WriteData (строка 2992) # rc = 0 # msgid = XYZ0064 # reqid = 0 # msg = конец веб-активности (раздел 200, # SysD 1, файлы 222, байты 343422089928, ошибки 0, прерванные файлы 0, занятые файлы 0)

Я хочу вытащить весь текст, который начинается с хэша, и имеет ключ и значение. Например, # msgtype = EVENT. Любой текст, который имеет только хэш и не имеет знака «=», будет рассматриваться как значение.

Поэтому в приведенной выше записи журнала я хочу получить список, который выглядит следующим образом

#msgtype=EVENT
#server=Web/Dev@server1web
#func=LKZ_WriteData ( line 2992 ) 
#rc=0
#msgid=XYZ0064 
#reqid=0
#msg=Web Activity end (section 200, # SysD 1, Files 222, Bytes 343422089928, Errors 0, Aborted Files 0, Busy Files 0) (Notice the hash present in the middle of the text)

Я попробовал опцию поиска всех регулярных выражений Python, но мне не удалось собрать все данные.

Например:

str='Oct 23 13:03:03.714012 prod1_xyz(RSVV)[201]: #msgtype=EVENT #server=Web/Dev@server1web #func=LKZ_WriteData ( line 2992 ) #rc=0 #msgid=XYZ0064 #reqid=0 #msg=Web Activity end (section 200, # SysD 1, Files 222, Bytes 343422089928, Errors 0, Aborted Files 0, Busy Files 0)'

z = re.findall("(#.+?=.+?)(:?#|$)",str)
print(z)

Вывод:

[('#msgtype=EVENT ', '#'), ('#func=LKZ_WriteData ( line 2992 ) ', '#'), ('#msgid=XYZ0064 ', '#'), ('#msg=Web Activity end (section 200, ', '#')]

Ответы [ 2 ]

1 голос
/ 25 октября 2019

(:?#|$) - это захватывающая группа , которая соответствует необязательному :, а затем # или концу строки. Поскольку re.findall возвращает все захваченные подстроки, результатом является список кортежей.

Вам необходимо

re.findall(r'#[^\s=]+=.*?(?=\s*#[^\s=]+=|$)', text)

См. Демонстрационную версию regex

Regex details

  • #[^\s=]+ - #, а затем любые 1+ символов, кроме пробелов и =
  • = - a =char
  • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?=\s*#[^\s=]+=|$) - до (и исключая) 0+ пробелов, #, 1+ символы, отличные от пробелов и =, а затем = или до конца строки.
0 голосов
/ 25 октября 2019
import re

s = "Oct 23 13:03:03.714012 prod1_xyz(RSVV)[201]: #msgtype=EVENT #server=Web/Dev@server1web #func=LKZ_WriteData ( line 2992 ) #rc=0 #msgid=XYZ0064 #reqid=0 #msg=Web Activity end (section 200, # SysD 1, Files 222, Bytes 343422089928, Errors 0, Aborted Files 0, Busy Files 0)"

a = re.findall('#(?=[a-zA-Z]+=).+?=.*?(?= #[a-zA-Z]+=|$)', s)

result = [item.split('=') for item in a]

print(result)

Дает:

[['#msgtype', 'EVENT'], ['#server', 'Web/Dev@server1web'], ['#func', 'LKZ_WriteData ( line 2992 )'], ['#rc', '0'], ['#msgid', 'XYZ0064'], ['#reqid', '0'], ['#msg', 'Web Activity end (section 200, # SysD 1, Files 222, Bytes 343422089928, Errors 0, Aborted Files 0, Busy Files 0)']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...