正则表达式,有条件地捕获不包含子字符串的行

时间:2012-10-09 10:49:52

标签: python regex python-2.6

我的代码正在解析日志文件中的一些行。

我做了很多事情,但是特别需要能够找到一条不包含某个子字符串的行。在一定条件下

我对正则表达式有很好的理解。但我似乎无法想出这个。

问题: 我想捕获任何不包含单词errorwarn的行。除非它是日志条目的第一部分,并用方括号括起来。

到目前为止,我尝试过这样的事情:

(((?:abc|cba)\s+.*(?!\[?(?!error|warn)\]?).*)|((abc|cba)\s+\[(error|warn)\]\s+(.*)))

日志中的行看起来像其中一些示例:

捕获第2组

abc [error] message
cba [error] message
cba [warn] message

捕获第1组

abc something random
cba i dont know

不捕获

abc some [error] message
cba some [warn] message

英语简单的问题;我希望获得以abccba开头的任何行。如果捕获组1中的任何位置没有[error][warn],则应抓住该行。仅当[error][warn]是条目的第一部分(abccba之后)

时,捕获组2才能获取

1 个答案:

答案 0 :(得分:4)

这应该可以解决问题:

^(?:abc|cba)(?:(?!.*(?:\[error\]|\[warn\]))|\s*(?:\[error\]|\[warn\])).*$

请注意,我断言整行与正则表达式匹配^$

我首先检查abccba开始行。

然后2例:

  • [error][warn]都不会出现在该行的任何位置:(?!.*(?:\[error\]|\[warn\]))?:不是很重要,只是非捕获组。)
  • [error][warn]紧随abccba\s*(?:\[error\]|\[warn\])之后。请注意,您可能希望将\s*更改为\s+,因为当前正则表达式将匹配abc[error]

然后其余的我不在乎.*,但它需要在那里,因为我使用$。我对Python不完全确定:检查是否可以删除正则表达式的.*$部分。

我将所有组都设置为非捕获,因为您似乎断言该行遵循某种格式。如果您需要同时从该行提取一些数据,请告诉我。