代码之家  ›  专栏  ›  技术社区  ›  Digital God

regexp组选择

  •  1
  • Digital God  · 技术社区  · 6 年前

    我一直在做日志分析。日志文件中有这些行。一切以行尾结束

    [2018.07.10 00:30:03:125]版本信息\886
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->输入时间\16
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->输入数据\397
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->线程ID\8
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->请求执行启动\16
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->请求信息\25
    [2018.07.10 00:30:03:109][traceid:8hrwsi105yvo91]->检查用户信息\139
    [2018.07.10 00:30:03:218]->启动RTS
    [2018.07.10 00:30:03:640][traceid:8hrwsi105yvo91]->开始执行任务\35
    [2018.07.10 00:30:03:749][traceid:8hrwsi105yvo91]->endexecutetask\36
    [2018.07.10 00:30:03:749][traceid:8hrwsi105yvo91]->请求执行结束\16
    [2018.07.10 00:30:03:749][traceid:8hrwsi105yvo91]->输出数据\26651
    < /代码> 
    
    

    我要按组分析每一行-时间、traceid(如果存在)和块名。 要选择日期时间(始终存在),我使用\[(.*?)\<代码>。这是第一组。 如果存在,则next必须是traceid。获取分隔符(?:\[->)-[or->or。group select与first相同\[(.*?)\<代码>。然后进入第三组,显示块名称([a-za-z]+).-any text at the end without numbers.

    我完全不明白如何把这一切联系起来。 我想得到的是:

    • 第1组-日期时间
    • 第2组-traceid零
    • 组3-块名称
    • \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。获取分离器(?:\[|->| )-[->. 组选择与第一个相同\[(?*)]\]. 然后用块名进入第三组([a-zA-Z ]+)-末尾没有数字的任何文本。

      我完全不明白如何把这一切联系起来。 我想得到的是:

      • 第1组-日期时间
      • 第2组-traceid零
      • 组3-块名称
    1 回复  |  直到 6 年前
        1
  •  2
  •   wizzwizz4    6 年前

    ^\[(.*?)\](?:\[(.*?)\])?->([a-zA-Z ]+)

    >>> 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 ]+)