【问题标题】:Trouble creating the exactly right Regular Expression无法创建完全正确的正则表达式
【发布时间】:2014-01-26 21:00:33
【问题描述】:

我有以下正则表达式(更新): ([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" 而不是 "c​​om"

我一直在使用 www.regexr.com

【问题讨论】:

  • 试试这个:txt2re.com。还将日志文件示例中的 URL 清理为假人。
  • 感谢我更新了我的帖子

标签: python regex apache search findall


【解决方案1】:

正则表达式

根据我所看到的你正在尝试做的事情,我想出了以下内容:

(\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

匹配一个我们不关心的空白字符

组4

(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。注意,因为 ?在上面的填充中,这将是第 7 组之后比赛遇到的前 200 场比赛

免责声明

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多