【问题标题】:Grabbing pieces inside .*? regex在里面抓取碎片。*?正则表达式
【发布时间】:2014-10-21 10:06:22
【问题描述】:

我有如下日志:

事件:“[INIT]WinEvtLog:安全性:AUDIT_SUCCESS(528):安全性:管理员:AMAZON-D071A6F8:AMAZON-D071A6F8:成功登录:用户名:管理员域:AMAZON-D071A6F8 登录 ID:(0x0,0x1054A66)登录类型:10 登录过程:User32 身份验证包:协商 工作站名称:AMAZON-D071A6F8 登录 GUID:- 调用者用户名:AMAZON-D071A6F8$ 调用者域:WORKGROUP 调用者登录 ID:(0x0,0x3E7) 调用者进程 ID:968 Transited Services : - 源网络地址:10.0.0.200 源端口:60054 [END]";

我用这个正则表达式捕获日志:

EVENT:\s\"\[INIT\](?P<log>.*?)\[END\]\";

我这样做是因为我想稍后显示整个EVENT

(?P&lt;log&gt;)里面有碎片我也想抢。例如,

Source\sPort:\s(?P<src_port>\d+)
Source\sNetwork\sAddress:\s(?P<src_network_addr>\S+)

以及EVENT 中的其他内容。

我不确定如何创建一个正则表达式来获取整个 EVENT 以及 EVENT 中的位。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    下面列出的正则表达式将匹配任何以EVENT: "[INIT] 开头并以[END]"; 结尾的事件日志。如果其中任何一个感兴趣的短语在事件日志中,它们将被记录下来。

    注意嵌套捕获组的使用:(?P&lt;log&gt;...(?P&lt;src_port&gt;...)...)。外部组将捕获其整个模式,包括内部组捕获的任何内容。

    另请注意,未参加比赛的任何组仍会出现在生成的dict 中,其值为None

    import re
    from pprint import pprint
    
    
    texts=[
        'EVENT: "[INIT]WinEvtLog: Security: AUDIT_SUCCESS(528): Security: Administrator: AMAZON-D071A6F8: AMAZON-D071A6F8: Successful Logon: User Name: Administrator Domain: AMAZON-D071A6F8 Logon ID: (0x0,0x1054A66) Logon Type: 10 Logon Process: User32 Authentication Package: Negotiate Workstation Name: AMAZON-D071A6F8 Logon GUID: - Caller User Name: AMAZON-D071A6F8$ Caller Domain: WORKGROUP Caller Logon ID: (0x0,0x3E7) Caller Process ID: 968 Transited Services: - Source Network Address: 10.0.0.200 Source Port: 60054 [END]";',
        'EVENT: "[INIT]Random text with one match Source Port: 60054 And stuff at end [END]";',
        'EVENT: "[INIT]Random text with no matches [END]";']
    
    
    for text in texts:
      match = re.match(
        r'''
          (?x)                                 # Verbose
          EVENT:\s"\[INIT]                     # anchor from beginning
          (?P<log>                             # record entire entry
            (?:                                # consisting of:
              (?:Source\sNetwork\sAddress:\s   #  src_network_address
                (?P<src_network_address>\S+))
              |                                # OR
              (?:Source\sPort:\s               #  src_port
                (?P<src_port>\S+))
              |                                # OR
              .*?                              #  anything else
            )*                                 # as many times as required
          )
          \s\[END]";$                          # anchor at end
        ''',
        text)
      if(match):
        pprint (match.groupdict())
    

    结果:

    {'log': 'WinEvtLog: Security: AUDIT_SUCCESS(528): Security: Administrator: AMAZON-D071A6F8: AMAZON-D071A6F8: Successful Logon: User Name: Administrator Domain: AMAZON-D071A6F8 Logon ID: (0x0,0x1054A66) Logon Type: 10 Logon Process: User32 Authentication Package: Negotiate Workstation Name: AMAZON-D071A6F8 Logon GUID: - Caller User Name: AMAZON-D071A6F8$ Caller Domain: WORKGROUP Caller Logon ID: (0x0,0x3E7) Caller Process ID: 968 Transited Services: - Source Network Address: 10.0.0.200 Source Port: 60054',
     'src_network_address': '10.0.0.200',
     'src_port': '60054'}
    {'log': 'Random text with one match Source Port: 60054 And stuff at end',
     'src_network_address': None,
     'src_port': '60054'}
    {'log': 'Random text with no matches',
     'src_network_address': None,
     'src_port': None}
    

    【讨论】:

      【解决方案2】:

      在另一个捕获组中捕获组,

      EVENT:\s\"\[INIT\](?P<log>.*?Source\sNetwork\sAddress:\s(?P<src_network_addr>\S+).*?Source\sPort:\s(?P<src_port>\d+).*?)\[END\]\"
      

      DEMO

      上述正则表达式将捕获log,以及log 中存在的src_portsrc_network_addr

      【讨论】:

      • 只有在元素是有序且非可选的情况下才有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2021-02-19
      • 2014-07-06
      • 2020-09-28
      • 2015-02-24
      • 1970-01-01
      • 2014-02-01
      相关资源
      最近更新 更多