在同一行上结合正面和负面匹配的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])
我期待看到线,正确的月份,并有与字符串“会话”线和“卷曲”排除在外,而是所有的线路返回。
请问我做错了什么?
是的,这是可能的。您需要构造一个正则表达式,如
^(?!.*(?:session|curl)).*Dec
请参阅regex demo。详细信息:
-
^
- 字符串的开始 -
(?!.*(?:session|curl))
- 没有session
或curl
应该出现在该行(如果添加了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')
谢谢!这工作,我把我的数据在演示,它出来了! – Sina
只是FYI:'^((??session | curl)。)* $'是一个非常耗费资源的构造([tempered greedy token](http://*.com/a/37343088/3832970))。如果可能,避免它,如果你需要匹配某些字符串而不是其他字符串,则使用简单的lookahead。 –
这是不可能告诉你做错了什么没有你的代码和数据,最好在[MCVE]的形式。尽管使用grep -v – pvg
可能会发现更简单一些日志示例将有所帮助 –
呃...它的apache日志。我在日志行中匹配字符串。 – Sina