Python在同一行上结合了正负匹配

时间:2016-12-16 07:52:53

标签: 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'/^((?!session|curl).)*/$')), f[line])

我希望看到具有正确月份的行,并且排除包含字符串“session”和“curl”的行,而是返回所有行。

请问我做错了什么?

1 个答案:

答案 0 :(得分:1)

是的,有可能。你需要构建一个像

这样的正则表达式
^(?!.*(?: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')