Python 正向查找正则表达式未按预期匹配

Python 正向查找正则表达式未按预期匹配,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,我试图在python正则表达式中使用正向查找来匹配此示例zpool输出中的设备名称和序列号。我想我对lookbehind语法不是很了解,因为我无法匹配序列号 我正在使用桌面上的Patterns应用程序对此进行沙箱处理。关于lookbehind断言,我还有其他几个问题,但我所能找到的似乎表明我走在了正确的轨道上,到目前为止,我所看到的一切都没有清楚地表明我错在哪里 pool ONLINE 0 0 0 raidz2-

我试图在python正则表达式中使用正向查找来匹配此示例
zpool
输出中的设备名称和序列号。我想我对lookbehind语法不是很了解,因为我无法匹配序列号

我正在使用桌面上的Patterns应用程序对此进行沙箱处理。关于lookbehind断言,我还有其他几个问题,但我所能找到的似乎表明我走在了正确的轨道上,到目前为止,我所看到的一切都没有清楚地表明我错在哪里

pool                           ONLINE       0     0     0
  raidz2-0                       ONLINE       0     0     0
    diskid/DISK-PK2331PAG6ZLMT   ONLINE       0     0     0 
    da21                         ONLINE       0     0     0 
    diskid/DISK-PK2331PAG6ZVMT   ONLINE       0     0     0 
    diskid/DISK-PK2331PAG728ET   ONLINE       0     0     0 
    diskid/DISK-PK2331PAG6YGXT   ONLINE       0     0     0 
我想获取第一组中的设备或序列号,以及第二组中的状态(ONLINE | AVAIL)。我使用的正则表达式是:

^\s+(da\d+|)(?为什么它不工作
让我们看一行,看看您的正则表达式匹配什么:

# your regex
^\s+(da\d+|(?<=diskid/DISK-)\S+)\s+(ONLINE|AVAIL)\s

# your string
    diskid/DISK-PK2331PAG6ZLMT   ONLINE       0     0     0
<                     # ^ assert position at start of string
^^^^                  # \s+ match one or more whitespace characters
    ^!                # da\d+ matches d, fails to match a, backtrack; try next alternation
<<<<<!                # (?<=diskid/DISK-) assert what precedes matches the lookbehind
# This fails because the text to the left of the position that the parser is at does
#     not match diskid/DISK- (it's four spaces as was previously matched by \s+)
赞成:一个捕获组
缺点:它无法确保第一个捕获组位于生产线的起点

选项2:定位到线的起点 这会将
\S+
捕获到捕获组1中,如果前面有
diskid/DISK-
,或
da\d+
捕获到捕获组2中,然后将
联机
可用
捕获到捕获组3中

^\s+(?:diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b
赞成:锚定到行的开头-我们可以确保这是我们试图匹配的数据(
^\s+
) Con:两个捕获组(我们无法将两组不同的数据与两组不同的条件匹配到一个捕获组中)

选项3:使用
regex
库 我们可以使用
PyPi regex
库很容易地完成它,生成一个组并声明它在字符串中的位置

分支重置方法(交替产生单个捕获组,而不是两个):


这是因为lookebind正在查看
^\s+
之后的位置(该文本显然不存在)。请尝试
(da\d)+|(?你可以用PyPi正则表达式模块来解决它。@ctwheels:我不确定你的意思。
^\s+diskid/DISK-
会匹配。
^\s+
@WiktorStribiż之后确实存在文本。你能扩展一下吗?为什么stdlib
re
模块不能在这里工作?我是根据stdlib文档编写的。因为您想要的是
(?谢谢!我想我现在理解了解析器中发生的事情。lookback正在做一些与我期望的稍有不同的事情。
^\s+(?:diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b
^\s+(?|diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b
      ^           # same as option 2, but uses branch reset