在Python中替换(re.sub)

时间:2017-01-25 01:19:29

标签: python regex

民间, 我来自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中正则表达式中标志的用法

1 个答案:

答案 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']]

补充参考: