2017-04-12 86 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']