簡體   English   中英

正后視正則表達式與預期不匹配

[英]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+)

如何解決?

有多種正則表達式模式可以滿足您要完成的任務:

選項 1:單個捕獲組

如果\\S+前面是diskid/DISK-da\\d+到捕獲組 1 中,則它會捕獲\\S+ ,然后將ONLINEAVAIL捕獲到捕獲組 2 中。

((?<=diskid/DISK-)\S+|da\d+)\s+(ONLINE|AVAIL)\b

優點:一個捕獲組
缺點:無法確保第一個捕獲組位於行首

選項 2:錨定到行首

這會將\\S+捕獲到捕獲組 1 中(如果它前面是diskid/DISK- ,或者da\\d+捕獲到捕獲組 2 中,然后將ONLINEAVAIL捕獲到捕獲組 3 中)。

^\s+(?:diskid/DISK-(\S+)|(da\d+))\s+(ONLINE|AVAIL)\b

優點:錨定到行首 - 我們可以確保這是我們試圖匹配的數據( ^\\s+ )缺點:兩個捕獲組(我們不能用兩組不同的條件匹配兩組不同的數據用於將字符串添加到一個捕獲組中)

選項 3:使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM