Проанализируйте строку журнала и сохраните в `Pandas.DataFrame `

#python #python-3.x #regex #pandas

#python #python-3.x #регулярное выражение #pandas

Вопрос:

Предположим, у меня есть Pandas.DataFrame :

 log_df = pd.DataFrame(columns=['type', 'ts', 'process', 'subprocess', 'num', 'message'])
 

и файл журнала, который содержит строки в следующем формате:

 ERROR:2021-04-19 08:43:10,562:trigger_manager.py:SpawnProcess-2:29:Stream has ended
 

и я хотел бы проанализировать ее с помощью : , но проблема в том, что у меня есть : символ, разделяющий поле метки времени, которое, очевидно, не следует анализировать.

Я попытался использовать простой str.split(sep=':') , что приводит к разделению time-stamp . Я думаю, что я должен использовать regex , но не знаю, как подойти к этой задаче.

Я был бы признателен за любую помощь.

Заранее спасибо.

Комментарии:

1. Если вы уже пробовали регулярное выражение, пожалуйста, поделитесь своей попыткой. Неясно, как вы храните и получаете доступ к своим текущим данным.

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

Ответ №1:

Вы можете использовать .str.extract() для извлечения содержимого файла журнала следующим образом:

В целях тестирования я создал одну строку данных из вашего файла журнала в серии log_file . Вы можете заменить свои данные:

 log_file = pd.Series(['ERROR:2021-04-19 08:43:10,562:trigger_manager.py:SpawnProcess-2:29:Stream has ended'])

log_df = log_file.str.extract(r'(?P<type>[^:] ):(?P<ts>. ,d ):(?P<process>[^:] ):(?P<subprocess>[^:] ):(?P<num>[^:] ):(?P<message>[^:] )')


print(log_df)


    type                       ts             process      subprocess num           message
0  ERROR  2021-04-19 08:43:10,562  trigger_manager.py  SpawnProcess-2  29  Stream has ended
 

Объяснение регулярных выражений

Я извлекаю ваши образцы данных в соответствии с именами столбцов целевого фрейма данных следующим образом:

(?P<type>[^:] ) именованная группа захвата для журнала type . Здесь [^:] совпадают символы, отличные от : , чтобы мы могли извлекать символы перед разделителем :

: сопоставьте разделитель : буквально

(?P<ts>. ,d ) именованная группа захвата для временной метки ts с наносекундами. Мы можем использовать . вместо из [^:] -за специального формата, имеющего , значение до наносекунд.

: сопоставьте разделитель : буквально

(?P<process>[^:] ) именованная группа захвата для process

: сопоставьте разделитель : буквально

(?P<subprocess>[^:] ) именованная группа захвата для subprocess

: сопоставьте разделитель : буквально

(?P<num>[^:] ) именованная группа захвата для num

: сопоставьте разделитель : буквально

(?P<message>[^:] ) именованная группа захвата для message