2017-04-12 167 views
1

我想提取从日志文件中访问的唯一文件。即"GET /socview/svspring01D.htm HTTP/1.1"*日志文件的正则表达式

因为我知道我想写一个正则表达式来提取所有这些文件的格式。我已经完成了这一个,但我对此并不满意。我将不胜感激这方面的一些帮助(我是编程新手) 另外,因为我可以使用GET作为出发点,所以我不希望将其提取为字典,是否有任何方法可以做到这一点?我使用字典来计算每个文件被访问的次数。

match = re.search (r'^GET.*\.1' ,logfile) 
+0

你想只有文件名?你使用哪种编程语言? – Jan

+0

python,只是文件名而已 – Deirdre

回答

0

使用下面的正则表达式:

^GET ([^\s]+).*$ 

再搭配第一组$1与它的路径一起获得的文件名。 ^字符匹配字符串的开头,([^\s]+)匹配每个字符(尽可能),直到下一个空白字符并形成匹配组。这是一个活生生的例子:https://regex101.com/r/pY7N0H/2


如果你只是想不带路径的文件名进行匹配,可以使用下面的正则表达式,并寻找第一场比赛$1(它需要相对路径,与/开始) :

^GET (?:\/[^\/\s]+)*\/([^\s]+).*$ 

这是一个活生生的例子:https://regex101.com/r/SdXViV/1

0

你可以使用(demo on regex101.com):

(?:GET|POST)\s+(/\S+) 
# GET or POST 
# followed by whitespaces 
# (capture/and no whitespaces at least once) 


Python这将是:

import re 

rx = re.compile(r'(?:GET|POST)\s+(/\S+)') 

string = """ 
"GET /socview/svspring01D.htm HTTP/1.1"* 
"GET /socvdsdiew/svspring0fsff323231D.htm HTTP/1.1"* 
"GET /socvhdhdhdiew/svspring0323231D.htm HTTP/1.1"* 
"POST /socddssdview/sveweweasd423232spring01D.htm HTTP/1.1"* 
""" 

files = rx.findall(string) 
print(files) 
# ['/socview/svspring01D.htm', '/socvdsdiew/svspring0fsff323231D.htm', '/socvhdhdhdiew/svspring0323231D.htm', '/socddssdview/sveweweasd423232spring01D.htm']