民间, 我来自TCL背景,并且是Python Automation的初学者。我试着读一下python中正则表达式的用法,并且与TCL的做事方式相比,没有发现它有所不同。
我遇到了一个问题,其中我有一个表输出,我需要解析,但在此之前我需要删除/替换一些我不解析的文本。
output="""
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater
Device ID Local Intrfce Holdtme Capability Platform Port ID
R4 Ser 1/0 139 R S I 3725 Ser 1/0
ESW1 Fas 0/1 149 S I 3725 Fas 0/1
"""
我需要从第一行删除所有文本,直到它与Repeater匹配,并用whitepsace替换它。
我以前用tcl做的方式是这样的。
regsub -all {^.*Repeater} $output {} newoutput
我在python中尝试以下代码,但它没有帮助我。
output=output.strip(' \t\n\s')
sub_output=re.sub('.*Repeater',' ',output)
需要帮助。另外,如果有任何文档解释Python中正则表达式中标志的用法
答案 0 :(得分:0)
您的问题陈述不明确,但我会假设您正在尝试提取"肉类"从这个网络设备的输出。
首先,我们可以使用str.splitlines()
轻松迭代每行输出。
通常情况下,我们可以只需str.split()
每一行来获取每个以空格分隔的项目。但是,您的某些信息本身包含空格(例如Ser 1/0
)。相反,我们会使用re.split()
并指出我们要在上拆分至少两个空格。
import re
def parse_table(output):
found_header = False
for line in output.splitlines():
if line.startswith('Device ID'):
found_header = True
continue
if not found_header:
continue
yield re.split(' {2,}', line)
sample_output="""
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater
Device ID Local Intrfce Holdtme Capability Platform Port ID
R4 Ser 1/0 139 R S I 3725 Ser 1/0
ESW1 Fas 0/1 149 S I 3725 Fas 0/1
"""
from pprint import pprint
pprint(list(parse_table(sample_output)))
<强>输出:强>
[['R4', 'Ser 1/0', '139', 'R S I', '3725', 'Ser 1/0'],
['ESW1', 'Fas 0/1', '149', 'S I', '3725', 'Fas 0/1']]