使用正则表达式,获取值并创建字典

问题描述 投票:0回答:2

第一次发布关于Python的持续学习。

目前,我只停留在一个非常简单的事情上:我有一个路由器的输出-称为“接口”的列表-在打印时看起来像这样:

set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24
set interfaces ge-0/0/1 unit 0 family inet dhcp
set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30
set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30

使用re模块(findall),我正在寻找并匹配一些所需的关键字,例如:

pattern1 = re.compile(r'ge.{1,7}')
pattern2 = re.compile(r'dhcp')
matched1 = pattern1.findall(interfaces)
matched2 = pattern2.findall(interfaces)

此时,问题是:如果此路由器输出的line(?)包含单词“ dhcp”,我想保存/存储该值并获取接口名称/编号。在上面的示例中,包含“ dhcp”的接口为“ ge-0 / 0/1”。你们知道我走的路正确吗?

  • 模型(获取两个正则表达式)有用,然后将两个值合并成字典,然后使用return打印吗?
  • 我如何解析其余的路由器代码行,以查找此“ dhcp”值,然后如果没有匹配项,则返回“无”或“不存在”输出?

预期的输出将如下所示(我使用“返回列表”来打印输出):

| interface   | service    |
|-------------+------------|
| ge-0/0/0    |  none      | 
| ge-0/0/1    |  dhcp      | 
| ge-0/0/2    |  none      |

任何指导,都将受到欢迎。谢谢。


编辑:谢谢你们到目前为止的回答。我正在添加更多信息,因为这可能是关键。我获得路由器输出的方法是使用SaltStack集成模块。我正在使用以下语法从Salt Master运行该python文件:

interfaces = __salt__['net.cli']('show configuration interfaces | display set', format='xml')['out']['show configuration interfaces | display set']

我衷心希望输出实际上是一个列表。

同时,我使用以下内容进行了另一次尝试:

def dhcp():

interfaces = __salt__['net.cli']('show configuration interfaces | display set', format='xml')['out']['show configuration interfaces | display set']

pattern = re.findall(r'ge.{1,7}', interfaces)
pattern1 = re.findall(r'dhcp', interfaces)

return pattern, pattern1 

输出是这个:

outright ~  sudo salt 'vsrx1' red.dhcp
vsrx1:
 |_
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/1 
   - ge-0/0/2 
   - ge-0/0/2 
 |_
   - dhcp

仅打印列表:

 outright ~  sudo salt 'vsrx1' red.dhcp
 vsrx1:
 List is: ['ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/1 ', 'ge-0/0/2 ', 'ge-0/0/2 ']

如果表达问题的方式在技术上不佳,我深表歉意。我仍在学习一般的术语。

python regex dictionary findall re
2个回答
0
投票

我不确定您如何获得路由器的输出。但这应该有效如果您的数据采用这种形式

interface_list = ['set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24',
'set interfaces ge-0/0/1 unit 0 family inet dhcp',
'set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30',
'set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30']

然后

interface_dict = {}
for element in interface_list:
    element_list = element.split(" ")
    if element_list[7] =='dhcp':
        interface_dict[element_list[2]] = 'dhcp'
    else:
        interface_dict[element_list[2]] = 'none'
print(interface_dict)

会给你

{'ge-0/0/0': 'none', 'ge-0/0/1': 'dhcp', 'ge-0/0/2': 'none'}

然后您可以将字典更改为数据框

import pandas as pd

df = pd.Series(interface_dict).to_frame().reset_index().rename(columns={'index':'interface', 0:'service'})
df 
    interface   service
0   ge-0/0/0    none
1   ge-0/0/1    dhcp
2   ge-0/0/2    none


0
投票

在我看来,您处在正确的轨道上。这是我对您所要求的解释。希望这可以帮助。注意:我是通过手机完成的,因此请原谅不正确的缩进

import re

s = ["set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24",
"set interfaces ge-0/0/1 unit 0 family inet dhcp", "set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30", 
"set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30"]

print("interfaces | services")
mydict ={}
def parse_addresses():
    for i in s:
            interface = re.search(r"ge.{1,7}", i)
            if "dhcp" in i:
                service = "dhcp"
                mydict.setdefault("router",{interface.group(): service})
            else:
                service = "None"
            print(f"{interface.group()} | {service}")
    if bool(mydict):
        return mydict
    return "None"

print(parse_addresses())
© www.soinside.com 2019 - 2024. All rights reserved.