regex - 正则表达式组选择
问题描述
我被日志解析困住了。我在日志文件中有这些行。一切以行尾结束\n
[2018.07.10 00:30:03:125] VersionInfo\886
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingTime\16
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingData\397
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->ThreadID\8
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->RequestExecuteStart\16
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->RequestInfo\25
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->CheckUserInfo\139
[2018.07.10 00:30:03:218]->Start RTS
[2018.07.10 00:30:03:640][TraceID: 8HRWSI105YVO91]->StartExecuteTask\35
[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->EndExecuteTask\36
[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->RequestExecuteEnd\16
[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->OutgoingData\26651
我想按组解析每一行 - 时间、traceid(如果存在)和块名称。要选择日期时间(始终存在),我使用\[(.*?)\]
. 是第一组。Next 必须是 traceid(如果存在)。获取分隔符(?:\[|->| )
-[
或。组选择与 first 相同。然后是带有块名称的第三组- 末尾没有数字的任何文本。->
\[(.*?)\]
([a-zA-Z ]+)
我完全不知道如何将这一切联系起来。我想要得到的是:
- 第 1 组 - 日期时间
- 第 2 组 - traceid | 零
- 第 3 组 - 块名称
解决方案
这应该可以解决问题:^\[(.*?)\](?:\[(.*?)\])?->([a-zA-Z ]+)
. 确保您使用的是多行标志。这是一个 Python 演示:
>>> for x in re.finditer(r'^\[(.*?)\](?:\[(.*?)\])?->([a-zA-Z ]+)', file, re.M):
print(x.group(1), x.group(2), x.group(3))
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 IncomingTime
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 IncomingData
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 ThreadID
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 RequestExecuteStart
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 RequestInfo
2018.07.10 00:30:03:109 TraceID: 8HRWSI105YVO91 CheckUserInfo
2018.07.10 00:30:03:218 None Start RTS
2018.07.10 00:30:03:640 TraceID: 8HRWSI105YVO91 StartExecuteTask
2018.07.10 00:30:03:749 TraceID: 8HRWSI105YVO91 EndExecuteTask
2018.07.10 00:30:03:749 TraceID: 8HRWSI105YVO91 RequestExecuteEnd
2018.07.10 00:30:03:749 TraceID: 8HRWSI105YVO91 OutgoingData
你可以让它只给你实际的跟踪 ID,使用^\[(.*?)\](?:\[TraceID: (.*?)\])?->([a-zA-Z ]+)
.
推荐阅读
- python - 使用浮点数和前导零格式化 pandas 数据帧
- python - 我认为,Mac python/pipenv 环境被 Saltstack 安装搞砸了?
- sparql - 距离,使用 Sparql 的多边形
- r - 有没有办法在 Shiny 的输入框旁边放置标签?
- authentication - Heroku 重新加载登录页面并且不显示任何消息
- javascript - getLastRow() 在第 68 行停止
- azure - BICEP 中的 MAP 类型参数/变量?
- android - 如何将布局插入另一个框架布局?
- python - 如何将 TensorFlow 2 中的crop_to_bounding_box 应用于符号张量?
- sql - 为什么我的值超出了“介于”范围内?