#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