当前位置: 首页 > 面试题库 >

跨多行的python正则表达式

邹嘉荣
2023-03-14
问题内容

我正在使用python和pexpect从某些cisco设备中收集一些信息,并且在RE上成功地提取了讨厌的小物件。恐怕我已经撞墙了。一些开关堆叠在一起,我已经在脚本中确定了这一点,并使用了一个单独的例程来解析数据。如果将交换机堆叠在一起,则会看到以下内容(从推杆输出中提取)

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

(星号表示掌握),
但掌握这些内容将使我走上正确的轨道


问题答案:
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编辑了问题,感谢汤姆指出+

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


 类似资料:
  • 如何提取所有字符(包括换行符),直到第一次出现单词序列?例如以下输入: 输入文本: 和序列我想从中提取文本到第二行中第一次出现的。 输出必须为- 我整个上午都在努力。我可以编写表达式来提取所有字符,直到遇到特定字符,但如果我使用这样的表达式: 跨换行符不匹配。

  • 问题内容: 我有一个最初用于python的正则表达式,用于从抓取的HTML页面提取2个字符串: 这在Python中可以正常工作,但在Objective-C / Swift中则不能。 这是我用来查找结果的Swift 2.0代码: 这是在HTML内部检查JS的示例,如下所示: 问题答案: 从您的反馈中,我看到您只需要告诉正则表达式引擎将换行符与句点匹配即可。 使用选项: 允许匹配任何字符,包括行分隔符

  • 问题内容: 我对多行字符串的replaceAll有问题: 以上适用于testWorks,但不适用于testIllegal !?为什么会这样,我该如何克服呢?我需要替换跨越多行的注释/ * … * /。 问题答案: 您需要使用标志来表示点应与换行符匹配。例如 或者使用例如在模式中指定标志

  • 问题内容: 假设我想要一个正则表达式,使其与“从iPhone发送”和“从iPod发送”都匹配。我该如何写这样的表达? 我尝试过类似的事情: 但似乎不起作用。 问题答案:

  • 问题内容: 我试图在Python 2.7.2中使用正则表达式从字符串中提取所有出现的带标记单词。或者简单地说,我想提取标签内的所有文本。这是我的尝试: 印刷产品 要获取的正确正则表达式是: 或。 谢谢。:) 问题答案: 产量 regex与unicode完全相同,但难于阅读。 第一个括号组告诉重新任何列表中的字符应匹配,并且同样与第二组括号。那你想什么都不要。所以, 卸下外围的方括号。(也除去杂散前

  • 问题内容: 我正在尝试抓取“ ”标记后的所有内容并将其删除,但是我的代码似乎没有执行任何操作。难道不支持正则表达式? 问题答案: 否。Python中的正则表达式由模块处理。 一般来说: