regex Python在文本字符串中查找值

8xiog9wr  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(138)

我正在用python构建一个网络自动化脚本,遇到了一个不知道如何解决的问题。

CPE-MGT {
    instance-type virtual-router;
    interface ge-0/0/0.0;
    routing-options {
        static {
            route 192.168.253.115/32 next-hop 192.168.100.1;
            route 0.0.0.0/0 next-hop 192.168.100.1;
        }
    }
}
DATA {
    instance-type virtual-router;
    interface ge-0/0/1.0;
}
MGMT_BK {
    instance-type virtual-router;
    interface ge-0/0/2.0;
    routing-options {
        static {
            route 192.168.253.115/32 next-hop 192.168.100.1;
            route 0.0.0.0/0 next-hop 192.168.100.1;
        }
    }
}

我需要获取名称,在那里我找到具体主键接口的名称;或许我给予一个例子会更清楚。
我有一个正则表达式,它查看文本并发现ge-0/0/0.0现在在文本中;我不知道的是如何获得CPE-MGT。

cmd = net_connect.send_command(
        juniper_cmds["sh_routing_instance"])
    logger.debug(f'{ip_dict[config_dict["csv_ip_colum"]][ips]}:Device routing instances {cmd}')
    regex_routing_instance = re.compile(f'{interface[0]}')
    routing_instance = regex_routing_instance.findall(cmd)```
ia2d9nvy

ia2d9nvy1#

可以使用两种模式和提供递归的regex模块:

import regex as re

data = """
CPE-MGT {
    instance-type virtual-router;
    interface ge-0/0/0.0;
    routing-options {
        static {
            route 192.168.253.115/32 next-hop 192.168.100.1;
            route 0.0.0.0/0 next-hop 192.168.100.1;
        }
    }
}
DATA {
    instance-type virtual-router;
    interface ge-0/0/1.0;
}
MGMT_BK {
    instance-type virtual-router;
    interface ge-0/0/2.0;
    routing-options {
        static {
            route 192.168.253.115/32 next-hop 192.168.100.1;
            route 0.0.0.0/0 next-hop 192.168.100.1;
        }
    }
}
"""

rx_block = re.compile(r"""
    ^(?P<name>[A-Z_-]+)\s+
    (?P<body>\{
        (?:(?:[^{}]+)|(?2))+
    \})
""", re.M | re.X)

rx_inner = re.compile(r"interface ge-0/0/0.0;")

for block in rx_block.finditer(data):
    m = rx_inner.search(block.group('body'))
    if m:
        print(block.group('name'))

这将产生

CPE-MGT

这里有两个注意事项:内部搜索实际上不需要正则表达式,因为它是一个静态字符串和两个字符串-可能使用解析器解决方案代替。
参见a demo for the expression on regex101.com

相关问题