可以过滤单词的复杂正则表达式

Complex Regex that can filter word

谁能帮我用正确的正则表达式来匹配第 1 行而不是第 2 行。我希望匹配条件基于

  1. 如果该行以 'username' 开头,后跟 1 个或多个空格
  2. 后跟一个数字和一个或多个空格
  3. 后跟任何不包含 'grep' 且以 'some/path/somescript.py'
  4. 结尾的字符串

下面的例子应该匹配第 1 行而不是第 2 行

line1 = "username   842 93.0  0.1 180740 36016 ?        Sl   Jan21 747:36 /some/path/somescript.py"
line2 = "username  8227  0.0  0.0  14356  2496 pts/5    S+   11:33   0:00 grep /some/path/somescript.py"

我试过 (^username\s*)(\d+\s*) 满足第 1 条和第 2 条,但不确定如何满足第 3 条要求。此 online 工具可能有助于测试

试试这个模式:

^username\s+\d+\s+(?!.*grep).*some\/path\/somescript\.py$

Demo

这里就不多解释了,除了这个:

(?!.*grep)

这是一个否定前瞻 断言,它表示在模式中的这个确切位置,断言我们在其余部分的任何地方都找不到 grep字符串。该断言已被发现,然后我们匹配:

.*some\/path\/somescript\.py$

也就是说,只要该行以 some/path/somescript.py.

结尾,我们就匹配任何内容