2012-05-03 81 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” –