不同长度的python正则表达式;或;向后看

不同长度的python正则表达式;或;向后看,python,regex,choice,lookbehind,negative-lookbehind,Python,Regex,Choice,Lookbehind,Negative Lookbehind,我有许多包含命令的日志。我过滤了所有包含“useradd”的日志,但现在我想记录一些误报: /etc/default/useradd /man8/useradd 问题是,我希望看到其中包含假阳性和真实命令的行(请参见测试用例) 我只能使用(一个或多个)python正则表达式,因为我使用的是日志分析器程序,所以没有真正的python程序。 以下是我尝试过的表达方式: (!/etc/default/|/man8/)useradd # no match (?<!/etc/default/|/

我有许多包含命令的日志。我过滤了所有包含“useradd”的日志,但现在我想记录一些误报:

  • /etc/default/useradd
  • /man8/useradd
问题是,我希望看到其中包含假阳性和真实命令的行(请参见测试用例)

我只能使用(一个或多个)python正则表达式,因为我使用的是日志分析器程序,所以没有真正的python程序。 以下是我尝试过的表达方式:

(!/etc/default/|/man8/)useradd # no match
(?<!/etc/default/|/man8/)useradd # look-behind requires fixed-width pattern
(?<!fault/|/man8/)useradd # works, but that's strange

您可以改为使用先行断言:

^(?!.*(?:/etc/default|/man8)/useradd(?!.*useradd)).*useradd
说明:


查看它。

您可以使用先行断言:

^(?!.*(?:/etc/default|/man8)/useradd(?!.*useradd)).*useradd
说明:


看看。

@Alex:谢谢你制作了一个演示!你,先生,应该写一本关于正则表达式的书。这是原始问题的完美答案-但我重新措辞了问题,它与新的测试用例不匹配:(@RonnyLindner:new RegEx处理测试用例,但如果项目的顺序被切换(即,如果法律案例不是最后一个在线案例),它将失败)。如果这种情况发生,那么使用Python的正则表达式将非常困难,如果不是不可能的话…@Alex:谢谢你创建了一个演示!先生,你应该写一本关于正则表达式的书。这是原始问题的完美答案-但我重新表述了问题,它与新的测试用例不匹配:(@RonnyLindner:new regex处理测试用例,但如果项目的顺序被切换(即,如果法律案例不是行中的最后一个),它将失败)如果这可能发生,如果不是不可能的话,很难用Python的正则表达式…抱歉,但我没有明确地说出我想要什么,现在应该更清楚了,如果使用第三方模块是一个选项,考虑到它在很多方面比股票RE好很多,特别是它支持变量查找。他在这个特殊的案例中是不可能的,但无论如何我都会记住这件事。谁知道我在Python自己需要什么?抱歉,但是我没有明确地说出我想要什么,现在应该更清楚了,如果使用第三方模块是你的选择,考虑到它在很多方面比股票RE好很多,特别是它支持VA。riable lookbehinds.感谢您提供的信息-在这种特殊情况下,这是不可能的,但我会记住这一点-谁知道我什么时候需要python本身!
^               # Start of string
(?!             # Assert that it's impossible to match...
 .*             # any string, followed by...
 (?:            # this non-capturing group containing...
  /etc/default  # either "/etc/default"
 |              # or
  /man8         # "/man8"
 )              # End of group, followed by...
 /useradd       # "/useradd"
 (?!.*useradd)  # UNLESS another "useradd" follows further up ahead.
)               # End of lookahead
.*              # Match anything, then match
useradd         # "useradd"