用于在Apache访问日志中查找日期的正则表达式

时间:2009-05-19 15:39:41

标签: python regex

我正在编写一个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)

或其他我甚至可以获得日期的部分的东西。我误解了什么?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

  • Apachelogs
  • Logtools
  • Logrep(Wtop包)

答案 2 :(得分:0)

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

另请参阅Python Regular Expression HOWTO和始终出色的Python pageregular-expressions.info

答案 3 :(得分:0)

不是使用正则表达式来获取日期,而是在空格上拆分行并提取日期可能更容易:

 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]

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