[英]Positive lookbehind regex not matching as expected
我正在嘗試在 python 正則表達式中使用正向后視來匹配此示例zpool
輸出中的設備名稱和序列號。 我想我不太了解后視語法,因為我無法匹配序列號。
我正在使用桌面上的 Patterns 應用程序對此進行沙盒處理。 我還有其他幾個關於后視斷言的 StackOverflow 問題,但我能找到的似乎表明我走在正確的軌道上,到目前為止我所看到的一切都沒有說明我做錯了什么。
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+|(?<=diskid/DISK-)\\S+)\\s+(ONLINE|AVAIL)\\s
它匹配設備名稱da21
及其狀態,但它沒有看到按序列號命名的設備。 我對這個語法遺漏了什么?
讓我們看一行,看看你的正則表達式匹配的是什么:
# 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+)
有多種正則表達式模式可以滿足您要完成的任務:
如果\\S+
前面是diskid/DISK-
或da\\d+
到捕獲組 1 中,則它會捕獲\\S+
,然后將ONLINE
或AVAIL
捕獲到捕獲組 2 中。
((?<=diskid/DISK-)\S+|da\d+)\s+(ONLINE|AVAIL)\b
優點:一個捕獲組
缺點:無法確保第一個捕獲組位於行首
這會將\\S+
捕獲到捕獲組 1 中(如果它前面是diskid/DISK-
,或者da\\d+
捕獲到捕獲組 2 中,然后將ONLINE
或AVAIL
捕獲到捕獲組 3 中)。
^\s+(?:diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b
優點:錨定到行首 - 我們可以確保這是我們試圖匹配的數據( ^\\s+
)缺點:兩個捕獲組(我們不能用兩組不同的條件匹配兩組不同的數據用於將字符串添加到一個捕獲組中)
regex
庫我們可以使用PyPi regex
庫很容易地完成它,產生一組並斷言它在字符串中的位置。
分支重置方法(交替產生單個捕獲組而不是兩個):
^\s+(?|diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b
^ # same as option 2, but uses branch reset
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.