如何为show vlan编写一个reg ex

时间:2018-04-20 20:47:57

标签: python regex

以下是我的尝试,但它没有做到正确。我的“文本”文件中有很多内容,但我想获取vlan和ports: 尝试使用Python:

([\d])+\W+[a-zA-Z]+\W+[A-Za-z]+\W+|[\w+]+([\d])/([\d])    

输出:

  

Vlan 1 Et0 / 1
  Vlan 1 Et0 / 3
  Vlan 1 Et0 / 4
  Vlan 1 Et0 / 5
  Vlan 1 Et0 / 6
  Vlan 1 Et0 / 7
  Vlan 2 Et0 / 0
  Vlan 3 Et0 / 2

从此......

asa#  Show switch vlan

VLAN Name                             Status    Ports

---- -------------------------------- --------- -----------------------------

1    inside                           up        Et0/1, Et0/3, Et0/4, Et0/5

                                                Et0/6, Et0/7

2    outside                          up        Et0/0

3    dmz                              up        Et0/2

2 个答案:

答案 0 :(得分:2)

您可以尝试使用此正则表达式捕获ports(?m)^(\d+)|(Et\d+\/\d+)

ss="""1    inside                           up        Et0/1, Et0/3, Et0/4, Et0/5

                                            Et0/6, Et0/7

2    outside                          up        Et0/0

3    dmz                              up        Et0/2"""

regx= re.compile(r'(?m)^(\d+)|(Et\d+\/\d+)')
vlan=""
for m in regx.finditer(ss):
    if m.group(1): vlan=m.group(1)
    if m.group(2):
        print("VLAN {} {}".format(vlan, m.group(2)))

Demo

在python中,

VLAN 1 Et0/1
VLAN 1 Et0/3
VLAN 1 Et0/4
VLAN 1 Et0/5
VLAN 1 Et0/6
VLAN 1 Et0/7
VLAN 2 Et0/0
VLAN 3 Et0/2

输出,

"ss" value

已修改,用于查看我之前对readability的回答中排除的输入文本变量{{1}}。

答案 1 :(得分:0)

这里的挑战是每个VLAN之间没有明确的分隔符。但是,如果我们假设VLAN的状态始终为up,那么输出可以通过编程方式一起被黑客攻击,如下所示:

vlan_id = 0
for vlan in txt.split('up'):
    for port in re.findall(r'(Et\d/\d)', vlan):
        print('Vlan {} {}'.format(vlan_id, port))
    vlan_id += 1