2009-12-09 38 views
3

我收集了一些使用python和pexpect的思科設備的信息,並且用RE來提取討厭的小項目很多成功。恐怕我已經擊中了這一面。一些交換機堆疊在一起,我已經在腳本中確定了這一點,並使用單獨的例程來解析數據。如果開關被堆疊可以看到以下(從昭版本輸出中提取)跨多行Python蟒正則表達式

Top Assembly Part Number  : 800-25858-06 
Top Assembly Revision Number : A0 
Version ID      : V08 
CLEI Code Number    : COMDE10BRA 
Hardware Board Revision Number : 0x01 


Switch Ports Model    SW Version    SW Image 
------ ----- -----    ----------    ---------- 
* 1 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    2 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    3 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    4 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 


Switch 02 
--------- 
Switch Uptime     : 11 weeks, 2 days, 16 hours, 27 minutes 
Base ethernet MAC Address  : 00:26:52:96:2A:80 
Motherboard assembly number  : 73-9675-15 

當我遇到此我需要提取開關數目&模型爲每個在4該表中,(SW可以忽略,但是可以有1到9個開關)這是多線路的事情,因爲我一直在休息。請有任何想法嗎?

OK道歉。我的正則表達式只是開始尋找最後一組 - 直到......然後我無法工作到哪裏去!
- {10] \ S- {10}(+。)開關

該模型將改變和開關的數量會有所改變,我需要捕獲4線在本例中其是

* 1 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    2 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    3 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    4 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 

但每個開關可以是一個不同的型號,有可能是1和9之間對於該示例理想我想獲得

*,1,WS-C3750-48P 
,2,WS-C3750-48P 
,3,WS-C3750-48P 
,4,WS-C3750-48P 

(星號表示主站)
但得到的那些線將設置米Ë在正確的軌道上

+2

你如何發佈當前正則表達式代碼你試過...我不知道我完全理解你想要得到什麼。 – Tom

回答

2
x="""Top Assembly Part Number  : 800-25858-06 
Top Assembly Revision Number : A0 
Version ID      : V08 
CLEI Code Number    : COMDE10BRA 
Hardware Board Revision Number : 0x01 


Switch Ports Model    SW Version    SW Image 
------ ----- -----    ----------    ---------- 
* 1 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    2 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    3 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 
    4 52  WS-C3750-48P  12.2(35)SE5    C3750-IPBASE-M 


Switch 02 
--------- 
Switch Uptime     : 11 weeks, 2 days, 16 hours, 27 minutes 
Base ethernet MAC Address  : 00:26:52:96:2A:80 
Motherboard assembly number  : 73-9675-15""" 

>>> import re 
>>> re.findall("^\*?\s*(\d)\s*\d+\s*([A-Z\d-]+)",x,re.MULTILINE) 
[('1', 'WS-C3750-48P'), ('2', 'WS-C3750-48P'), ('3', 'WS-C3750-48P'), ('4', 'WS-C3750-48P')] 

UPDATE:因爲OP編輯的問題,並感謝湯姆指出爲+

>>> re.findall("^(\*?)\s+(\d)\s+\d+\s+([A-Z\d-]+)",x,re.MULTILINE) 
[('*', '1', 'WS-C3750-48P'), ('', '2', 'WS-C3750-48P'), ('', '3', 'WS-C3750-48P'), ('', '4', 'WS-C3750-48P')] 
>>> 
+0

+1,因爲我認爲你很快就能回答這個問題:-)。但要清理這個......我會用\ s +而不是\ s *。另外,在這種情況下,re.MULTILINE並不重要。我相信你的解決方案在沒有它的情況下也能運作:-) – Tom

+0

@Tom,那麼,你需要多行IF來匹配開始行,正如我在我的回答中闡述的那樣 - 我只是不確定是否需要同步這取決於如何識別「模型」。 –

+0

嗯你上面做什麼看起來不錯,但你只是解析表。你正在使用的字符串是在中間的表格中間的一大堆其他文本的中間(見原文)。我的數據可能有50行以上和以下 – user225882

11

要有.匹配任何字符,包括換行,編譯RE與re.DOTALL之間的選項(記住,如果你有多個選項,使用|,他們之間的位或操作符,以便合併它們)。

在這種情況下,我不知道你實際上需要這個 - 爲什麼不喜歡

re.findall(r'(\d+)\s+\d+\s+(WS-\S+)') 

例如假設你確定一個「模式」的方式是,它與WS-開始?在findall的一個結果和下一個結果之間會出現換行這一事實在這裏不成問題。您能否準確解釋您如何確定「模型」以及爲什麼「多行」是一個問題?也許你希望re.MULTILINE在每次開始行時都會匹配^,以便抓住你的數據並引用一些行的開始......?

+1

亞歷克斯,再次,你擊敗了我:-)。多線正則表達式的關鍵在於re.DOTALL(這很令人困惑,因爲你會認爲它是re.MULTILINE)。但是,正如他指出的那樣,在這種情況下你不需要它,因爲你想要提取的數據是在它自己的行上:-)。另外,我喜歡那個alex使用\ s +,意思是一個或多個空格字符。另外,我可能會添加一件事......我通常喜歡給我的組命名:(?P WS- \ S +)。 – Tom

+0

嗯,你可能是正確的 - 將嘗試並報告回來,但因爲我是英國,它將是明天。非常感謝您的時間 – user225882