无法创建完全正确的正则表达式

时间:2014-01-26 21:00:34

标签: python regex apache search findall

我有以下正则表达式(已更新): ([0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z-.][a-zA-Z0-9+\.[a-zA-Z0-9-.]+)(\.)([a-zA-Z0-9]+)([\.:/\s]).+?"\s200

我还从长服务器日志中摘录了以下行(已更新):

218.5.192.147 - - [14/Mar/2004:02:31:06 -0500] "GET http://searchanytime.com" 200 - "-" "-"
202.101.150.100 - - [12/Mar/2004:21:18:55 -0500] "GET http://nationalwholesalellc.com" 200 114887 "-" "-"

它按计划用于这些行:

220.173.17.142 - - [09/Mar/2004:23:32:13 -0500] "POST http://www.canada44.ca/ HTTP/1.1" 200 27095 "http://www.so123.com" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)"
212.160.136.163 - - [10/Mar/2004:01:01:46 -0500] "GET http://www.6seconds.org/ HTTP/1.0" 200 51937 "http://www.helavasearch.com/cgi-bin/search.cgi?username=amundii&keywords=parenting" "Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)"
218.72.85.59 - - [10/Mar/2004:01:05:13 -0500] "GET http://hpcgi1.nifty.com/trino/ProxyJ/prxjdg.cgi HTTP/1.1" 200 2221 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"

在几乎所有情况下,第7组都是我的顶级域名(com,cn,org等)。但是对于具有.com“而不是.com HTTP / 1.1”的行,它不起作用并将组7作为“searchanytime”而不是“com”返回

我一直在使用www.regexr.com

1 个答案:

答案 0 :(得分:0)

正则表达式

从我所看到的你想要做的事情中,我想出了以下内容:

(\d{2}/\w{3}/\d{4})(.+)(GET|POST)\s(http://|https://)(\w+)?\.?([\w\d]+)\.(\w+).*?200

细分

我会对正则表达式进行细分,以便如果它不是100%正在寻找的东西,那么希望它会让你顺路而上

组1

(\d{2}/\w{3}/\d{4})

捕获日志条目上的日期,格式为DD / MMM / YYYY

组2

(.+)

捕获此组与下一组之间的填充物。从您的第一个示例开始,这将匹配:02:31:06 -0500] "注意:如果POSTGET

第3组

(GET|POST)

漂亮的自我解释

填料

\s

匹配我们不关心的单个空格字符

GROUP4

(http://|https://)

也很直接

组5

这是你认为你的正则表达式崩溃的地方。

(\w+)?\.?

这将匹配日志条目的www或hpcgi1部分。注意?角色使这个组可选。这适用于

等情况
[14/Mar/2004:02:31:06 -0500] "GET http://searchanytime.com" 200 - "-" "-"

6组

([\w\d]+)

中间部分(即canada44,nifty)或第一部分(即searchanytime)

组7

([\w\d]+)

结束部分(即com,org)

填料

.*?

'com','org'等与200之间的任何字符(尽可能少)。如果你想引用其中任何一个,你应该捕获它。

结束

200

匹配200.注意,因为?在上面的填充中,这将是group7之后匹配遇到的前200个

声明

我实际上没有在在线regex tool之外的日志消息上测试此正则表达式。 我不确定你想要/需要的分组,但希望这会有所帮助。