我正在尝试搜索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'/^((?!session|curl).)*/$')), f[line])
我希望看到具有正确月份的行,并且排除包含字符串“session”和“curl”的行,而是返回所有行。
请问我做错了什么?
答案 0 :(得分:1)
是的,有可能。你需要构建一个像
这样的正则表达式^(?!.*(?: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')