Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨多行的python正则表达式_Python_Regex - Fatal编程技术网

跨多行的python正则表达式

跨多行的python正则表达式,python,regex,Python,Regex,我正在使用python和pexpect从一些cisco设备收集一些信息,并且在使用REs提取烦人的小项目方面取得了很大的成功。恐怕我在这件事上碰壁了。一些开关堆叠在一起,我在脚本中识别了这一点,并使用单独的例程解析数据。如果开关堆叠,您将看到以下内容(从sho ver输出中提取) 当我遇到这种情况时,我需要提取4个表中每个开关的开关编号和型号(sw可以忽略,但可能有1到9个开关),这是多线的事情让我感到满意,因为我对其余的都很满意。有什么想法吗 好的,抱歉。我的正则表达式只是开始查看最后一组-直

我正在使用python和pexpect从一些cisco设备收集一些信息,并且在使用REs提取烦人的小项目方面取得了很大的成功。恐怕我在这件事上碰壁了。一些开关堆叠在一起,我在脚本中识别了这一点,并使用单独的例程解析数据。如果开关堆叠,您将看到以下内容(从sho ver输出中提取)

当我遇到这种情况时,我需要提取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编辑了这个问题,感谢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')]
>>>

要使
匹配任何字符(包括换行符),请在选项之间编译RE(请记住,如果有多个选项,请在它们之间使用
|
,位或运算符,以便组合它们)

在这种情况下,我不确定你真的需要这个——为什么不做类似的事情呢

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

例如,假设您识别“模型”的方式是以
WS-
开头?在
findall
的一个结果和下一个结果之间将出现换行这一事实在这里不是问题。您能否准确地解释如何识别“模型”以及为什么要“多行”这是一个问题吗?也许你想让
^
在每行的开头匹配,以获取与行的开头相关的数据…?

如何发布你尝试过的当前正则表达式代码…我不确定我是否完全理解你试图获得的内容。Alex,再次,你击败了我:-)。执行多行正则表达式的关键es实际上是re.DOTALL(这令人困惑,因为您可能会认为它是re.MULTILINE)。但是,正如他指出的,在这种情况下,您不需要它,因为您要提取的数据位于其自身的行:-)。此外,我喜欢alex使用\s+,表示1个或多个空白字符。此外,我可能已经添加了一件事……我通常喜欢命名我的组:(?PWS-\s+).Hmm您可能是对的-将尝试并报告,但由于我是英国人,明天将是。非常感谢您的时间+1,因为我认为您在快速回答问题方面做得很好:-)。但是为了解决这个问题…我将使用\s+而不是\s*。此外,在这种情况下,re.MULTILINE没有任何重要作用。我相信您的解决方案会无需它即可工作:-)。@Tom,如果要匹配行首,那么您需要多行,正如我在回答中详细阐述的那样——我只是不确定是否确实需要与行首同步,这取决于“模型”的方式HMM你上面所做的看起来不错,但是你只是在解析表。你使用的字符串在中间的一大堆其他文本中(见原始文章),中间有表。我的数据有50行以上,BeloWBTW模型总是会启动WS-OK,我不确定它总是从WS--开始,去更新它。
re.findall(r'(\d+)\s+\d+\s+(WS-\S+)')