regex 在look-behind中具有不同长度“or”的python正则表达式

shyt4zoc  于 2023-01-06  发布在  Python
关注(0)|答案(1)|浏览(110)

我有许多日志中的命令。我过滤了所有的日志与“useradd”在他们,但现在我想dicard一些误报:

  • .../etc/默认值/用户添加...
  • ....../man 8/用户添加...

问题是,我希望看到其中包含误报和真实的命令的行(参见测试用例)。
我只能使用(一个或多个)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

在对其他问题的回答中,正则表达式被更改,以便可以使用前瞻-但我不认为这在这里是可能的。

[编辑:添加了一些测试用例]

## no match
cat /etc/default/useradd 
less /usr/share/man/ja/man8/useradd.8.gz
## match:
useradd evil
/usr/sbin/useradd
cat /etc/default/useradd; useradd evil
cat /etc/default/useradd; /usr/sbin/useradd evil
cat /etc/default/useradd; cd /usr/lib/; ../sbin/useradd evil
wztqucjr

wztqucjr1#

您可以改用前瞻Assert:

^(?!.*(?:/etc/default|/man8)/useradd(?!.*useradd)).*useradd
    • 说明:**
^               # 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"

看它live on regex101.com

相关问题