2

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

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

我对正则表达式有很好的理解。但我似乎无法弄清楚这一点。

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

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

(((?: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

简单英语的问题;我想得到任何以abcor开头的行cba。如果第 1 组没有[error]或没有[warn]任何位置,则捕获组 1 应该抓住该线。只有当[error][warn]是条目的第一部分(在abcor之后cba)时,捕获组 2 才应获取它

4

1 回答 1

4

这应该可以解决问题:

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

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

我首先检查abccba启动线路。

然后是2种情况:

  • 既不[error]也不[warn]出现在该行的任何地方:((?!.*(?:\[error\]|\[warn\]))不是?:很重要,只是非捕获组)。
  • 或者[error]或者[warn]紧随其后abcand cba: \s*(?:\[error\]|\[warn\])。请注意,您可能想要更改\s*\s+,因为当前的正则表达式将匹配abc[error]

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

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

于 2012-10-09T10:57:11.653 回答