跨越多行的python正则表达式

时间:2009-12-09 00:52:03

标签: python regex

我正在使用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  

(星号表示主人)
但获得这些线条会让我走上正轨

2 个答案:

答案 0 :(得分:12)

要让.匹配任何字符(包括换行符),请在选项中使用re.DOTALL编译您的RE(请记住,如果您有多个选项,请使用|,或者运算符,在它们之间,以便将它们组合起来。)

在这种情况下,我不确定你确实需要这个 - 为什么不喜欢

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

例如,假设您识别“模型”的方式是它以WS-开头? findall的一个结果与下一个结果之间会有换行的事实在这里不是问题。你能准确解释一下你如何识别“模型”以及为什么“多线”是一个问题吗?也许您希望re.MULTILINE在每个行首开始进行^匹配,以便通过引用行的开头来获取数据...?

答案 1 :(得分:3)

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')]
>>>