【问题标题】:Regex for finding date in Apache access log用于在 Apache 访问日志中查找日期的正则表达式
【发布时间】:2009-05-19 15:39:41
【问题描述】:

我正在编写一个 python 脚本来从我们的 2GB Apache 访问日志中提取数据。这是日志中的一行。

81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"

我正在尝试从该行获取日期部分,而正则表达式让我失望了,我不知道为什么。这是我的python代码:

l = 81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"

re.match(r"\d{2}/\w{3}/\d{4}", l)

什么都不返回。也不做以下事情:

re.match(r"\d{2}/", l)
re.match(r"\w{3}", l)

或其他任何我能做到的事情,甚至可以得到日期的部分。我误会了什么?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    match() 在字符串的开头查找匹配项。使用 search() 在字符串中的任意位置查找匹配项。更多信息在这里:http://docs.python.org/library/re.html#matching-vs-searching

    【讨论】:

    • 我怎么错过了。感谢您的快速回复。
    【解决方案2】:

    或者您可以使用已经可用的 python apache 日志解析器之一,例如:

    • Apache 日志
    • 日志工具
    • Lo​​grep(Wtop 包)

    【讨论】:

      【解决方案3】:

      match() 尝试匹配整个字符串。请改用search()

      另请参阅 Python Regular Expression HOWTOPython page 始终出色的 regular-expressions.info

      【讨论】:

        【解决方案4】:

        与使用正则表达式获取日期相比,将行拆分为空格并提取日期可能更容易:

         l = '81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"'
         date = l.split()[3]
        

        如果您正在处理非常大的文件,这可能比使用正则表达式更有效。

        【讨论】:

        • 我也想过这个问题,但我也想获取用户代理字符串,并在空格上拆分会破坏它。此外,个人re.search('\d{2}/\w{3}/\d{4} 似乎比l.split()[3] 更具语义(查找两位数/三个字符/四位数字)(查找字符串中的第四个块)。为了将来的可读性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        相关资源
        最近更新 更多