2013-04-09 62 views
2

我試圖解析一系列SHOW CDP NEIGHBORS DETAIL輸出,以便我可以捕獲每個設備及其IP地址。Python重複捕獲組

我遇到的問題是有些設備可能會分配多個IP地址,這裏是一個示例輸出。

Device ID: RTPER1.MFN21Mb.domain.local 
Entry address(es): 
    IP address: 200.152.51.3 
    IP address: 82.159.177.233 
    IP address: 201.152.51.140 
    IP address: 84.252.100.3 
Platform: Cisco 2821, Capabilities: Router Switch IGMP 

我寫這個正則表達式來捕獲輸入,並根據gskinner它匹配所有4個IP地址,但捕獲僅僅是最後一個(從正則表達式預期)

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+ 

所以我去網上找出如何做到這一點。我嘗試了這裏建議的正則表達式Capturing repeating subpatterns in Python regex,但是使用正則表達式模塊並沒有改變輸出。我仍然只獲得列表中的最後一個IP地址,而其他地址都沒有。

繼例子中,我得到

temp = regex.match(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+', file) 
print temp 

溫度返回無。

如果我確實找到了。我得到的只是最後一個IP地址84.252.100.3

的回報。如果我添加多個捕獲羣體,如

temp = regex.findall(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?', file) 
print temp 

只匹配具有複式IP地址的,而不是其他

希望有人能幫助。

+0

你確定你效仿的榜樣密切? (正則表達式模塊) – nhahtdh 2013-04-09 17:11:19

+0

@nhahtdh我用我得到的回覆更新了我的帖子 – iargue 2013-04-09 17:26:49

+0

使用'search'而不是'match'。 'match'總是從字符串的開頭開始。 – nhahtdh 2013-04-09 17:36:09

回答

1

據我所知,只有.NET允許您迭代量化(重複)捕獲組。考慮這個(有限)替代:

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)? 
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

這將在$2捕獲了1個IP地址和起來$3$4$5三個。 (當然,我使用慣用的$表示法。)可以根據需要添加任意數量。如果你需要的所有IP地址存在於一個組,$2,那麼你唯一的選擇就是包括與他們的文字:

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+((?:IP address: (?:[0-9.]+)\s+)+) 
                ^    ^^   ^
+0

我自己並沒有使用它,但是Python'regex'模塊似乎允許獲取由重複的組捕獲的文本列表,正如OP鏈接到的問題中的答案一樣。 (無論如何,第一個選項甚至不是一個選項,國際海事組織,因爲你正在施加一個上限) – nhahtdh 2013-04-09 17:19:48

+1

@nhahtdh - 啊,我的錯誤。我只讀了第一個答案,而我自己並不熟悉Python。我從過去的正則表達式討論中識別出你的名字。因此,如果有適當的尊重,我不認爲強加一個上限會使選項失效。特別是在(現在發現不正確的)前提下,沒有其他辦法,能夠指定一個能夠捕獲多達100個IP地址的正則表達式可能足以滿足OP的實際需求。 – 2013-04-09 18:45:53

+0

我認爲在你的文章中使用第二個選項更爲實際(取整塊同質數據並使用第二遍來提取它)。我的目的是阻止使用第一種方法,除非它是一次性業務。 – nhahtdh 2013-04-09 19:24:24