在同一行上结合正面和负面匹配的Python

问题描述:

我试图通过apache日志文件进行搜索,以便拉出没有特定字符串的行(“会话”和“卷曲”),行必须有特定的月份字符串(“Dec”)。 在搜索自己的工作:在同一行上结合正面和负面匹配的Python

re.search("^((?!session|curl).)*$", f[line]) 
re.search(r'Dec', f[line]) 

我想知道如果我可以与他们在一个连接组合脱身? 我想这

re.search('|'.join('(?:{0})'.format(x) for x in (r'Dec', r'/^((?!session|curl).)*/$')), f[line]) 

我期待看到线,正确的月份,并有与字符串“会话”线和“卷曲”排除在外,而是所有的线路返回。

请问我做错了什么?

+1

这是不可能告诉你做错了什么没有你的代码和数据,最好在[MCVE]的形式。尽管使用grep -v – pvg

+0

可能会发现更简单一些日志示例将有所帮助 –

+0

呃...它的apache日志。我在日志行中匹配字符串。 – Sina

是的,这是可能的。您需要构造一个正则表达式,如

^(?!.*(?:session|curl)).*Dec 

请参阅regex demo。详细信息:

  • ^ - 字符串的开始
  • (?!.*(?:session|curl)) - 没有sessioncurl应该出现在该行(如果添加了DOTALL修饰符,整个字符串将被视为)
  • .*Dec - 任何0+如果不使用DOTALL修饰符,字符(除了换行符字符以外)尽可能多,直到最后一次出现Dec子字符串。

如果需要全字匹配,请在组/字旁边添加字边界(\b)。

样品Python demo

import re 
words = ['session', 'curl'] 
month = 'Dec' 
x = '|'.join([re.escape(w) for w in words]) 
m = re.search(r'^(?!.*({})).*{}'.format(x, month), 'Date: Dec 2016') 
if m: 
    print('Matched') 
+1

谢谢!这工作,我把我的数据在演示,它出来了! – Sina

+0

只是FYI:'^((??session | curl)。)* $'是一个非常耗费资源的构造([tempered greedy token](http://*.com/a/37343088/3832970))。如果可能,避免它,如果你需要匹配某些字符串而不是其他字符串,则使用简单的lookahead。 –