Python在同一行上组合正匹配和负匹配
我正在尝试搜索apache日志文件,以便提取没有特定字符串的行(“session”和“curl”),并且这些行必须有特定的月份字符串(“Dec”)。 这些搜索是独立工作的:Python在同一行上组合正匹配和负匹配,python,regex,Python,Regex,我正在尝试搜索apache日志文件,以便提取没有特定字符串的行(“session”和“curl”),并且这些行必须有特定的月份字符串(“Dec”)。 这些搜索是独立工作的: re.search("^((?!session|curl).)*$", f[line]) re.search(r'Dec', f[line]) 我想知道我是否可以将它们合并到一个连接中? 我试过这个 re.search('|'.join('(?:{0})'.format(x) for x in (r'Dec', r'/^(
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”的行,但所有行都返回
请问我做错了什么?是的,这是可能的。您需要构造一个类似正则表达式的
^(?!.*(?:session|curl)).*Dec
看。详情:
-字符串的开头^
-行上不应出现(?!.*(:session | curl))
或session
(如果添加点调用修饰符,将考虑整个字符串)curl
-尽可能多的任何0+字符(如果未使用DOTALL修饰符,则换行字符除外),直到最后一次出现*Dec
子字符串Dec
\b
)
样本:
如果没有代码和数据(最好是以文本形式),就不可能知道自己做错了什么。虽然您可能会发现使用grep-vsome日志会更简单,但这个示例将非常有用,它的apache日志。我正在匹配日志行中的字符串。谢谢!这起作用了,我把我的数据放在演示中,结果非常棒!仅供参考:
^((?!session | curl)。*$
是一个非常消耗资源的结构(a)。尽可能避免,如果需要匹配其他字符串而不是其他字符串,请使用简单的lookaheads。
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')