【问题标题】:regex, capture a line not containing sub-string conditionally正则表达式,有条件地捕获不包含子字符串的行
【发布时间】:2012-09-29 16:34:42
【问题描述】:

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

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

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

问题: 我想捕获任何不包含单词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 行中工作?就像您将行一一传递给正则表达式进行检查?
  • @nhahtdh 文件的每一行都被正则表达式解析。 1 比 1。是的。

标签: python regex python-2.6


【解决方案1】:

这应该可以解决问题:

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

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

我首先检查abccba 开始行。

那么2种情况:

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

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

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

【讨论】:

  • 非常感谢。您的解决方案帮助我找到了对我有用的方法。如果有兴趣,我目前正在使用:((?:abc|cba)(?!.*(?:\[(?:error|warn)\]).*).*)|((abc|cba)\s+\[(error|warn)\]\s+(.*)) - 使它起作用的是在负前瞻中包含.* ((?!)) :) regexr.com?32db0
  • @InbarRose:我不确定您使用的是哪个功能,但请检查此案例:"sfdkjsfhk abc [error] askdjhaksd" - 应该被拒绝。
  • 是的 - 我知道,但这只是主要正则表达式的一部分。情况不同。感谢你的关心。在我完成了所有其他工作之后,我只是想具体弄清楚如何忽略具有该特定格式的行。 - 还有 - 我链接了错误的正则表达式 - 它应该是 regexr.com?32db3
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2017-05-10
  • 2021-12-30
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多