第一次发布关于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”。你们知道我走的路正确吗?
预期的输出将如下所示(我使用“返回列表”来打印输出):
| 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 ']
如果表达问题的方式在技术上不佳,我深表歉意。我仍在学习一般的术语。
我不确定您如何获得路由器的输出。但这应该有效如果您的数据采用这种形式
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
在我看来,您处在正确的轨道上。这是我对您所要求的解释。希望这可以帮助。注意:我是通过手机完成的,因此请原谅不正确的缩进
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())