【问题标题】:Python RegEx - Getting multiple pieces of information out of a stringPython RegEx - 从字符串中获取多条信息
【发布时间】:2009-05-29 02:18:56
【问题描述】:

我正在尝试使用 python 来解析日志文件并在一个正则表达式中匹配 4 条信息。 (纪元时间,服务通知,主机名和关键)我似乎无法让它工作。到目前为止,我只能匹配四个中的两个。是否有可能做到这一点?下面是日志文件中的一个字符串示例,以及到目前为止我已经开始工作的代码。任何帮助都会让我成为一个快乐的菜鸟。

[1242248375] SERVICE ALERT: myhostname.com;DNS: Recursive;CRITICAL;SOFT;1;CRITICAL - 插件在执行系统调用时超时

hostname = options.hostname

n = open('/var/tmp/nagios.log', 'r')
n.readline()
l = [str(x) for x in n]
for line in l:
    match = re.match (r'^\[(\d+)\] SERVICE NOTIFICATION: ', line)
    if match:
       timestamp = int(match.groups()[0])
       print timestamp

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以使用| 来匹配各种可能的事物中的任何一种,并使用re.findall 来获取与某个RE 的所有非重叠匹配。

    【讨论】:

      【解决方案2】:

      这个问题有点令人困惑。但是你不需要用正则表达式来做所有事情,你可能想尝试一些很好的普通字符串函数,比如'split'。

      此版本也将避免一次将整个文件加载到内存中,即使抛出异常也会关闭文件。

      regexp = re.compile(r'\[(\d+)\] SERVICE NOTIFICATION: (.+)')
      with open('var/tmp/nagios.log', 'r') as file:
          for line in file:
              fields = line.split(';')
              match = regexp.match(fields[0])
              if match:
                  timestamp = int(match.group(1))
                  hostname = match.group(2)
      

      【讨论】:

        【解决方案3】:

        您一次可以使用多个组,例如:

        import re
        
        logstring = '[1242248375] SERVICE ALERT: myhostname.com;DNS: Recursive;CRITICAL;SOFT;1;CRITICAL - Plugin timed out while executing system call'
        exp = re.compile('^\[(\d+)\] ([A-Z ]+): ([A-Za-z0-9.\-]+);[^;]+;([A-Z]+);')
        m = exp.search(logstring)
        
        for s in m.groups():
            print s
        

        【讨论】:

        • 仅供参考,exp.match(logstring) 在这个例子中同样有效。即,解决方案不使用 search() 而不是 match()。
        • 当然,好点。我习惯于使用搜索而不是匹配,但由于我们从字符串的开头开始,所以它是相同的。关键是添加四个不同的分组括号来获取 OP 想要的四个东西。
        【解决方案4】:

        如果您想拆分生产线的那些特定部分。

        类似的东西:

        match = re.match(r'^\[(\d+)\] (.*?): (.*?);.*?;(.*?);',line)
        

        应该在各自的索引中分组给出这些部分中的每一个。

        【讨论】:

          【解决方案5】:

          是否可以像您的模式中的“SERVICE NOTIFICATION”与您的示例中的“SERVICE ALERT”不匹配一样简单?

          【讨论】:

            猜你喜欢
            • 2014-10-25
            • 1970-01-01
            • 2012-11-11
            • 1970-01-01
            • 1970-01-01
            • 2023-01-07
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多