首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从系统报告中提取IP地址

从系统报告中提取IP地址
EN

Stack Overflow用户
提问于 2016-09-16 09:13:55
回答 2查看 132关注 0票数 0

我遍历地址条目,使用Python regex提取地址以添加到我的列表中。下面是一个示例输入字符串和所需的输出。我该怎么做?

代码语言:javascript
复制
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>
"""

输出:

代码语言:javascript
复制
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”
EN

回答 2

Stack Overflow用户

发布于 2016-09-16 10:48:18

请参阅提取所有数据的这个判据

代码语言:javascript
复制
(?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并构建生成的字符串:

代码语言:javascript
复制
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演示

票数 1
EN

Stack Overflow用户

发布于 2016-09-16 18:36:19

我发现了一些类似的东西,并使用字典覆盖了所有属性:

代码语言:javascript
复制
(?P<name>^[A-Z0-9]+)\n|(?P<attr>^[\w]+[^:]+):\s(?P<val>[\d\w\.]+)\n

在python中,不可能从每个正则表达式匹配一次以上的组中恢复中间捕获(据我所知),但我的一些可怕的python应该完成这项工作。

我还随机制作了一本字典,因为我不清楚你在问什么。

代码语言:javascript
复制
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 d

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39527727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档