2012-05-03 118 views
0

表達我有有日誌非常相似,Apache日誌定期匹配查詢字符串

這裏一個日誌文件是一個示例日誌行

41.13.0.155 - - [03/May/2012:00:00:08 -0700] "GET /gameState?type=udid&udid=A100001837E58D4&game=TapFish HTTP/1.1" 200 38812 - "Dalvik/1.4.0 (Linux; U; Android 2.3.5; GT-B5510 Build/GINGERBREAD)" 

我能這個字符串從日誌行分開"GET /gameState?type=udid&udid=A100001837E58D4&game=TapFish HTTP/1.1"

我想要遍歷所有的行搶所有同時滿足下列條件 登錄專線應具有"GET /gameState?type=[[anything]]"但日誌行[什麼]不應該'neighbor'

請提出了一些正則表達式,可以匹配上述條件

回答

1

我不知道我的理解所有的約束,但這應該工作:

.+GET /gameState(?!.*type=neighbor\b).* 

你基本上不匹配,如果它gameState後斑點type=neighbor任何地方,且僅當neighbor在單詞邊界(type=neighborhood是確定)。

0

使用負向前查找字符串排除鄰居:

for line in logfile: 
    match = re.search("GET /gameState?type=(?!neighbor)", line") 
+0

這與'type ='後面的內容不符。 (Lookaheads不參加比賽。) – alan

+0

它不匹配類型= –

3

可以使用negative lookahead以匹配行不包括子:

.+GET /gameState\?type=(?!neighbor).+ 
+0

之後的任何內容。根據他嘗試製作的比賽,使用'。+ GET/gameState \?type =(?! neighbor \ b)+'。 '\ b'接着匹配是在**字邊界**,如果像_neighborhood_是一個很好的匹配,這可能是有用的。儘管如此,答案可能是正確的本身;) –

+0

它確實工作正常,我們有一個參數類型,但我想匹配那些沒有類型=參數的網址。如下面的URL 「GET/gameState」 –