我遍历地址条目,使用Python regex提取地址以添加到我的列表中。下面是一个示例输入字符串和所需的输出。我该怎么做?
var = """
sw1:FID256:root> ipaddrshow
CHASSIS
Ethernet IP Address: 10.17.11.10
Ethernet Subnetmask: 255.255.210.0
CP0
Ethernet IP Address: 10.17.11.11
Ethernet Subnetmask: 255.255.210.0
Host Name: cp0
Gateway IP Address: 10.17.48.1
CP1
Ethernet IP Address: 10.17.11.12
Ethernet Subnetmask: 255.255.210.0
Host Name: cp1
Gateway IP Address: 10.17.18.1
sw1:FID256:root>
"""输出:
List Index 0 “chassis,ip 10.17.11.10 chassis,mask 255.255.210.0”
List Index 1 “cp0,ip 10.17.11.11 cp0,mask 255.255.210.0 cp0,gw 10.17.18.1”
List Index 2 “cp1,ip 10.17.11.12 cp1,mask 255.255.240.0 cp1,gw 10.17.18.1”发布于 2016-09-16 10:48:18
请参阅提取所有数据的这个判据:
(?m)^([a-zA-Z0-9]+)(?:\r?\n|\r)Ethernet IP Address: ([\d.]+)(?:\r?\n|\r)Ethernet Subnetmask: ([\d.]+)(?:(?:\r?\n|\r)Host Name: ([a-z\d]+)(?:\r?\n|\r)Gateway IP Address: ([\d.]+))?详细信息
(?m) -多行模式使^匹配行开始^ -石灰启动([a-zA-Z0-9]+) -第1组,一个或多个字母数字(?:\r?\n|\r) -一个线段Ethernet IP Address: -文字字符串([\d.]+) -第2组,1+数字和点(?:\r?\n|\r)Ethernet Subnetmask: ([\d.]+) -类似于上面包含子网掩码的第3组的模式(?:(?:\r?\n|\r)Host Name: ([a-z\d]+) -类似于上面的模式,第4组包含主机名(?:\r?\n|\r)Gateway IP Address: ([\d.]+))? -类似于上面的模式,第5组包含网关。现在,您只需要使用re.finditer并构建生成的字符串:
import re
p = re.compile(r'^([a-zA-Z0-9]+)(?:\r?\n|\r)Ethernet IP Address: ([\d.]+)(?:\r?\n|\r)Ethernet Subnetmask: ([\d.]+)(?:(?:\r?\n|\r)Host Name: ([a-z\d]+)(?:\r?\n|\r)Gateway IP Address: ([\d.]+))?', re.MULTILINE)
s = "sw1:FID256:root> ipaddrshow \n\nCHASSIS\nEthernet IP Address: 10.17.11.10\nEthernet Subnetmask: 255.255.210.0\n\nCP0\nEthernet IP Address: 10.17.11.11\nEthernet Subnetmask: 255.255.210.0\nHost Name: cp0\nGateway IP Address: 10.17.48.1\n\nCP1\nEthernet IP Address: 10.17.11.12\nEthernet Subnetmask: 255.255.210.0\nHost Name: cp1\nGateway IP Address: 10.17.18.1\n\nsw1:FID256:root>"
result = ["{0},ip {1} {0},mask {2} {3},gw {4}".format(z.group(1).lower(),z.group(2),z.group(3).lower(),z.group(4),z.group(5)) if z.group(4) else "{0},ip {1} {0},mask {2}".format(z.group(1).lower(),z.group(2),z.group(3)) for z in p.finditer(s)]
print(result)见Python演示。
发布于 2016-09-16 18:36:19
我发现了一些类似的东西,并使用字典覆盖了所有属性:
(?P<name>^[A-Z0-9]+)\n|(?P<attr>^[\w]+[^:]+):\s(?P<val>[\d\w\.]+)\n在python中,不可能从每个正则表达式匹配一次以上的组中恢复中间捕获(据我所知),但我的一些可怕的python应该完成这项工作。
我还随机制作了一本字典,因为我不清楚你在问什么。
import re
var = """
sw1:FID256:root> ipaddrshow
CHASSIS
Ethernet IP Address: 10.17.11.10
Ethernet Subnetmask: 255.255.210.0
CP0
Ethernet IP Address: 10.17.11.11
Ethernet Subnetmask: 255.255.210.0
Host Name: cp0
Gateway IP Address: 10.17.48.1
CP1
Ethernet IP Address: 10.17.11.12
Ethernet Subnetmask: 255.255.210.0
Host Name: cp1
Gateway IP Address: 10.17.18.1
sw1:FID256:root>
"""
rgx = re.compile(r'(?P<name>^[A-Z0-9]+)\n|(?P<attr>^[\w]+[^:]+):\s(?P<val>[\d\w\.]+)\n', re.MULTILINE)
dict = {
"Ethernet IP Address": "ip",
"Ethernet Subnetmask": "mask",
"Gateway IP Address": "gw",
"Host Name": ""
}
def translate(attr):
return dict[attr]
def build_list(r):
entry = ""
name = ""
for l in rgx.finditer(var):
if(l.group("name")):
if(entry):
r.append(entry[:-1])
entry = ""
name = l.group("name").lower()
elif(l.group("attr")):
varname = translate(l.group("attr"))
value = l.group("val")
if(varname != ""):
entry += "{0},{1} {2} ".format(name, varname, value)
# add last entry
r.append(entry[:-1])
entry = ""
def build_dict(d):
entry = ""
name = ""
for l in rgx.finditer(var):
if(l.group("name")):
name = l.group("name").lower()
d[name] = {}
elif(l.group("attr")):
varname = translate(l.group("attr"))
value = l.group("val")
if(varname != ""):
d[name][varname] = value
r = []
build_list(r)
print r
d = {}
build_dict(d)
print dhttps://stackoverflow.com/questions/39527727
复制相似问题