[英]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})
as_path
組包含一個組。 我將其更改為非捕獲組。 attribs
更改為\\S+(?:,\\s+\\S+){2}
\\S+
,然后將以下兩次精確匹配:
,\\s+\\S+
逗號字符,然后是空格字符一次或多次,然后是任何非空格字符一次或多次 peer_addr
和peer_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))+)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.