簡體   English   中英

python-正則表達式將重復模式放在單個組中

[英]python - regex putting repeating patterns in a single group

我正在嘗試解析正則表達式中的字符串,並且在那里達到99%。

我的測試字符串是

 1
  1234 1111 5555 88945
    172.255.255.255 from 172.255.255.255 (1.1.1.1)
      Origin IGP, localpref 300, valid, external, best
      rx pathid: 0, tx pathid: 0x0

我當前的正則表達式模式是:

(?P<as_path>(\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s(?P<attribs>\S+,\s{0,4})

我正在使用regex101進行測試,並在此處鏈接到測試https://regex101.com/r/iGM8ye/1

所以目前我有一個group2我不想要這個組,有人可以告訴我為什么我要獲得這個組以及如何刪除它嗎?

第二個是,在我要匹配單詞“ valid,external,best”的屬性中,當前我的模式僅匹配“ valid”,我以為在組中添加重復項將匹配所有三個,但它沒有“T。

我如何實現將“字符串,字符串,字符串”(字符串逗號空間)的重復匹配到一組?

謝謝

編輯

所需的輸出

as_path : 1234 1111 5555 88945
peer_addr : 172.255.255.255
peer_rid : 1.1.1.1
local_pref : 300
attribs : valid, external, best 

附屬機構也可能只是有效的,外部的或外部的,或者是格式為(stringcommaspace)的另一個條目

試試正則表達式:( (?P<as_path>(?:\\d{4,10}\\s){1,20})\\s+(?P<peer_addr>\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}).*\\((?P<peer_rid>\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3})\\)\\s+.*localpref\\s(?P<local_pref>\\d+),\\s(?P<attribs>[\\S]+,(?: [\\S]+,?)*){0,4}

演示

問題中的正則表達式具有(\\d{4,10}\\s)的捕獲組(組2 (\\d{4,10}\\s) 現在已將其更改為非捕獲組(?:\\d{4,10}\\s)

請參閱此處使用的正則表達式。

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}(?:\.\d{0,3}){3}).*\((?P<peer_rid>\d{0,3}(?:\.\d{0,3}){3})\)\s+.*localpref\s(?P<local_pref>\d+),\s+(?P<attribs>\S+(?:,\s+\S+){2})
  1. 您之所以進入第2組,是因為您的as_path組包含一個組。 我將其更改為非捕獲組。
  2. 我將attribs更改為\\S+(?:,\\s+\\S+){2}
    • 這將匹配任何非空格字符一次或多次\\S+ ,然后將以下兩次精確匹配:
      • ,\\s+\\S+逗號字符,然后是空格字符一次或多次,然后是任何非空格字符一次或多次
  3. 我將peer_addrpeer_rid更改為\\d{0,3}(?:\\.\\d{0,3}){3}而不是\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3} 這是首選項,但是會縮短表達式。

如果沒有這最后的修改,你可以使用下面的正則表達式(它稍微好一點的執行(就像看到這里 ):

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s+(?P<attribs>\S+(?:,\s+\S+){2})

您還可以通過為下建議使用更具體的令牌提高性能(請注意,我還添加了x修改,以使其更清晰),並為看到這里

(?P<as_path>\d{4,10}(?:\s\d{4,10}){0,19})\s+
(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})[^)]*
\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+
.*localpref\s(?P<local_pref>\d+),\s+
(?P<attribs>\w+(?:,\s+\w+){2})

之所以會得到該單獨的組,是因為您要重復一個捕獲組,而最后一次迭代將是該捕獲組,在這種情況下,您可以將其88945而不捕獲(?:

對於第二部分,您可以使用輪換方式來完全匹配其中一個選項(?:valid|external|best)

您的模式可能如下所示:

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s(?P<attribs>(?:valid|external|best)(?:,\s{0,4}(?:valid|external|best))+)

regex101演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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