[英]python regular expression across multiple lines
我正在使用python和pexpect從一些cisco設備收集一些信息,並且在REs上取得了很多成功來提取討厭的小項目。 我擔心我會碰到這個問題。 有些交換機堆疊在一起,我已在腳本中識別出這一點並使用單獨的例程來解析數據。 如果開關堆疊,您會看到以下內容(從示波器輸出中提取)
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個開關)這是多線的東西讓我像我一樣其余的都沒問題。 有什么想法嗎?
好的道歉。 我的正則表達式只是開始查看最后一組 - 直到..然后我無法工作到哪里去!
- {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
(星號表示主人)
但獲得這些線條會讓我走上正軌
有.
匹配任何字符,包括換行符,在選項中用re.DOTALL編譯你的RE(記住,如果你有多個選項,在它們之間使用|
,位或運算符,以便將它們組合起來)。
在這種情況下,我不確定你確實需要這個 - 為什么不喜歡這樣的東西
re.findall(r'(\d+)\s+\d+\s+(WS-\S+)')
例如,假設您識別“模型”的方式是它以WS-
開頭? 在findall
一個結果和下一個結果之間會有換行的事實在這里不是問題。 你能准確解釋一下你如何識別“模型”以及為什么“多線”是一個問題嗎? 也許你希望re.MULTILINE在每個行首開始進行^
匹配,通過引用行的開頭來獲取數據......?
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')]
更新 :因為OP編輯了問題,並感謝Tom指出+
>>> 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')]
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.