Регулярное выражения для многострочной строки
Есть логи python. Текущая регулярка \d{4}-\d{1,2}-\d{1,2}.+ работает корректно, до тех пор пока stacktrace не появляется в логах. Подскажите как забирать stacktrace тоже
2022-04-19 13:55:49.174 | INFO | app.api.routes.log_route:custom_route_handler:16 - GET http://localhost:8000/api/v1/index
2022-04-19 13:55:49.178 | INFO | app.api.routes.log_route:custom_route_handler:25 - Headers: dict_items([('host', 'localhost:8000'), ('connection', 'keep-alive'), ('sec-ch-ua', '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"'), ('accept', 'application/json'), ('sec-ch-ua-mobile', '?0'), ('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'), ('sec-ch-ua-platform', '"Windows"'), ('sec-fetch-site', 'same-origin'), ('sec-fetch-mode', 'cors'), ('sec-fetch-dest', 'empty'), ('referer', 'http://localhost:8000/docs'), ('accept-encoding', 'gzip, deflate, br'), ('accept-language', 'ru,en-XA;q=0.9,en;q=0.8,ru-RU;q=0.7,en-US;q=0.6,de;q=0.5,it;q=0.4,zh-TW;q=0.3,zh;q=0.2,ja;q=0.1'), ('cookie', 'ASP.NET_SessionId=d1wtpsbpqdjntwb0rp3j3sti; UserSettings=language=1; __RequestVerificationToken_Lw__=bp3iNdWQP7IFur0mONhrHU+e0Wjau2II1lyAmGXKgKdv/V+rPbagY13GnOiSXa8bgJZjh7wwIdlf6P9Edn44EZIghqj+CRfrmn+H5tyX3PMtQQQftSyhU16Qg+odLLcVcrhuxSi53lVPFfUFVthvRhKTt+qOLHaO0UhT3jD8Qyg=; Pycharm-e98a1fd0=877be75f-a386-4588-920e-20b3850001d9; session=.eJyVkUtqxTAMRfficSCWHf-ylVKCbMsvoXlxsB1oKd17TT-zFlrQQELnXl3QK1tSobqyuZWLBrZskc1MWo2OnAGIPJCOkTurDSqfbCCSVnFLmmByvUevOBFwrYhICyG9QZF8mmICCSpSNMZNkry3RoObgjTSdANtOQdMOmgfjFcuScflpBTwKFkPclK540FH-44WaklLy0909IQOECfvpAhCCY9CQ3IiGicEYi8jgayzMXaniLelNmxXXdK2NypdjvveN3sOuFMfu-XATrzRsm615fLC5ge2tnbO4_gBrbm22XLLx-eQ7-PeqbFLfkZCPg4KbcvH30GKWxvhV_J_V7_MHgd2VSqfLwX29g5dYJpX.YlA19Q.QuvF7jmHf6atVt_4kfq0Ti3y8bE; grafana_session=82b55dabe87d3124be95d652cd319fc8; sid=Fe26.2**013fe3bf766ef709aa68083c32bf8e9eb9ed53895384c38fb7e324af670c7e06*giji5dbxRExtOcjvfz5LYg*_V4BvTQgLwNLVjyjW3E7_2JmP7qM94-eDpdBAEJ4RkoT40r_G_I-izIl09KG3NcPUVHGKqh92KLsc_qc3Z0kZkg_LrvN_OGjmWwk4xFkoJ87f9q0d5_ryofbkHByVA5FwKdlxjFxeYB858u3FkC5GznjbPSDjCKpjtxAVCTTPXQ-PMU4U__ufT8qKkPN7KLGtllgO98Hiw3o8K5ccXoUpb9hFaIl7E4n4UkVHoNqZ38IQLXQVbrmxxO2_IKSz8K1**e4dcc612a41ab107e17537e3922f39465a90066674a91f4efa5745ef698e11fa*CVSQ0UcvfLZDg2EA_asFkOqcHB72bjrHdoaHKd_c30Y')])
2022-04-19 13:55:49.194 | ERROR | app.api.routes.log_route:custom_route_handler:37 -
Traceback (most recent call last):
File "C:\Users\Admin\trash\elasticsearch-kibana-docker\.\app\api\routes\log_route.py", line 32, in custom_route_handler
response: Response = await original_route_handler(request)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 227, in app
raw_response = await run_endpoint_function(
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 162, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\starlette\concurrency.py", line 39, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\to_thread.py", line 28, in run_sync
return await get_asynclib().run_sync_in_worker_thread(func, *args, cancellable=cancellable,
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\_backends\_asyncio.py", line 818, in run_sync_in_worker_thread
return await future
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\_backends\_asyncio.py", line 754, in run
result = context.run(func, *args)
File "C:\Users\Admin\trash\elasticsearch-kibana-docker\.\app\api\routes\index_api.py", line 16, in get_index
return int(x)
ValueError: invalid literal for int() with base 10: 'asd'
2022-04-19 13:56:09.043 | INFO | app.api.routes.log_route:custom_route_handler:16 - GET http://localhost:8000/api/v1/index
2022-04-19 13:56:09.045 | INFO | app.api.routes.log_route:custom_route_handler:25 - Headers: dict_items([('host', 'localhost:8000'), ('connection', 'keep-alive'), ('sec-ch-ua', '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"'), ('accept', 'application/json'), ('sec-ch-ua-mobile', '?0'), ('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'), ('sec-ch-ua-platform', '"Windows"'), ('sec-fetch-site', 'same-origin'), ('sec-fetch-mode', 'cors'), ('sec-fetch-dest', 'empty'), ('referer', 'http://localhost:8000/docs'), ('accept-encoding', 'gzip, deflate, br'), ('accept-language', 'ru,en-XA;q=0.9,en;q=0.8,ru-RU;q=0.7,en-US;q=0.6,de;q=0.5,it;q=0.4,zh-TW;q=0.3,zh;q=0.2,ja;q=0.1'), ('cookie', 'ASP.NET_SessionId=d1wtpsbpqdjntwb0rp3j3sti; UserSettings=language=1; __RequestVerificationToken_Lw__=bp3iNdWQP7IFur0mONhrHU+e0Wjau2II1lyAmGXKgKdv/V+rPbagY13GnOiSXa8bgJZjh7wwIdlf6P9Edn44EZIghqj+CRfrmn+H5tyX3PMtQQQftSyhU16Qg+odLLcVcrhuxSi53lVPFfUFVthvRhKTt+qOLHaO0UhT3jD8Qyg=; Pycharm-e98a1fd0=877be75f-a386-4588-920e-20b3850001d9; session=.eJyVkUtqxTAMRfficSCWHf-ylVKCbMsvoXlxsB1oKd17TT-zFlrQQELnXl3QK1tSobqyuZWLBrZskc1MWo2OnAGIPJCOkTurDSqfbCCSVnFLmmByvUevOBFwrYhICyG9QZF8mmICCSpSNMZNkry3RoObgjTSdANtOQdMOmgfjFcuScflpBTwKFkPclK540FH-44WaklLy0909IQOECfvpAhCCY9CQ3IiGicEYi8jgayzMXaniLelNmxXXdK2NypdjvveN3sOuFMfu-XATrzRsm615fLC5ge2tnbO4_gBrbm22XLLx-eQ7-PeqbFLfkZCPg4KbcvH30GKWxvhV_J_V7_MHgd2VSqfLwX29g5dYJpX.YlA19Q.QuvF7jmHf6atVt_4kfq0Ti3y8bE; grafana_session=82b55dabe87d3124be95d652cd319fc8; sid=Fe26.2**013fe3bf766ef709aa68083c32bf8e9eb9ed53895384c38fb7e324af670c7e06*giji5dbxRExtOcjvfz5LYg*_V4BvTQgLwNLVjyjW3E7_2JmP7qM94-eDpdBAEJ4RkoT40r_G_I-izIl09KG3NcPUVHGKqh92KLsc_qc3Z0kZkg_LrvN_OGjmWwk4xFkoJ87f9q0d5_ryofbkHByVA5FwKdlxjFxeYB858u3FkC5GznjbPSDjCKpjtxAVCTTPXQ-PMU4U__ufT8qKkPN7KLGtllgO98Hiw3o8K5ccXoUpb9hFaIl7E4n4UkVHoNqZ38IQLXQVbrmxxO2_IKSz8K1**e4dcc612a41ab107e17537e3922f39465a90066674a91f4efa5745ef698e11fa*CVSQ0UcvfLZDg2EA_asFkOqcHB72bjrHdoaHKd_c30Y')])
2022-04-19 13:56:09.049 | ERROR | app.api.routes.log_route:custom_route_handler:37 -
Traceback (most recent call last):
File "C:\Users\Admin\trash\elasticsearch-kibana-docker\.\app\api\routes\log_route.py", line 32, in custom_route_handler
response: Response = await original_route_handler(request)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 227, in app
raw_response = await run_endpoint_function(
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 162, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\starlette\concurrency.py", line 39, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\to_thread.py", line 28, in run_sync
return await get_asynclib().run_sync_in_worker_thread(func, *args, cancellable=cancellable,
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\_backends\_asyncio.py", line 818, in run_sync_in_worker_thread
return await future
File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\anyio\_backends\_asyncio.py", line 754, in run
result = context.run(func, *args)
File "C:\Users\Admin\trash\elasticsearch-kibana-docker\.\app\api\routes\index_api.py", line 16, in get_index
return int(x)
ValueError: invalid literal for int() with base 10: 'asd'
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Если среда программирования не Ruby, используйте следующий шаблон с флагом m (re.M (Python), RegexOptions.Multiline (.NET), Pattern.MULTILINE (Java) и т.д.):
^\d{4}-\d{1,2}-\d{1,2} .*(?:\r?\n(?!\d{4}-\d{1,2}-\d{1,2} ).*)*
См. пример использования выражения.
Подробности:
^- начало строки\d{4}-\d{1,2}-\d{1,2}- четыре цифры, дефис, одна или две цифры, дефис, одна или две цифры, пробел.*- оставшаяся часть строки(?:\r?\n(?!\d{4}-\d{1,2}-\d{1,2} ).*)*- ноль и более повторов...\r?- необязательный перевод каретки\n(?!\d{4}-\d{1,2}-\d{1,2} )- перевод на новую строку, сразу после которого нет четырёх цифр, дефиса, одной или двух цифр, дефиса, одной или двух цифр и затем пробела.*- оставшаяся часть строки.