正则表达式组选择

时间:2018-07-29 17:23:58

标签: regex go

我被日志解析所困扰。我在日志文件中有此行。一切都以行尾\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(如果存在)和块名。 要选择日期时间(始终存在),我使用\[(.*?)\]。这是第一组。 下一个必须为traceid(如果存在)。获取分隔符(?:\[|->| )-[->。组选择与第一个\[(.*?)\]相同。然后进入第三组,其块名称为([a-zA-Z ]+)-结尾的任何文本都没有数字。

我对如何连接所有内容完全感到困惑。 我想得到的是:

  • 第1组-日期时间
  • 第2组-traceid |零
  • 第3组-块名称

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:^\[(.*?)\](?:\[(.*?)\])?->([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

您可以使用^\[(.*?)\](?:\[TraceID: (.*?)\])?->([a-zA-Z ]+)使其仅提供实际的跟踪ID。