我的代码正在解析日志文件中的一些行。
我做了很多事情,但是特别需要能够找到一条不包含某个子字符串的行。在一定条件下
我对正则表达式有很好的理解。但我似乎无法想出这个。
问题: 我想捕获任何不包含单词error
或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
英语简单的问题;我希望获得以abc
或cba
开头的任何行。如果捕获组1中的任何位置没有[error]
或[warn]
,则应抓住该行。仅当[error]
或[warn]
是条目的第一部分(abc
或cba
之后)
答案 0 :(得分:4)
这应该可以解决问题:
^(?:abc|cba)(?:(?!.*(?:\[error\]|\[warn\]))|\s*(?:\[error\]|\[warn\])).*$
请注意,我断言整行与正则表达式匹配^
和$
。
我首先检查abc
和cba
开始行。
然后2例:
[error]
和[warn]
都不会出现在该行的任何位置:(?!.*(?:\[error\]|\[warn\]))
(?:
不是很重要,只是非捕获组。)[error]
或[warn]
紧随abc
和cba
:\s*(?:\[error\]|\[warn\])
之后。请注意,您可能希望将\s*
更改为\s+
,因为当前正则表达式将匹配abc[error]
。然后其余的我不在乎.*
,但它需要在那里,因为我使用$
。我对Python不完全确定:检查是否可以删除正则表达式的.*$
部分。
我将所有组都设置为非捕获,因为您似乎断言该行遵循某种格式。如果您需要同时从该行提取一些数据,请告诉我。