2016-09-16 19 views
0

我遍歷地址條目,使用Python正則表達式提取要添加到我的列表中的地址。這是一個示例輸入字符串和所需的輸出。我該怎麼做呢?從系統報告中提取IP地址

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」 
+0

盪滌語法,澄清問題的陳述,刪除不需要的標籤。 – Prune

+0

你有兩個有用的答案。請接受您的最愛,並將您的後續問題作爲新問題發佈。 – Prune

回答

1

this regex提取所有的數據:

(?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 demo

+0

非常感謝你..現在我知道了..但我需要更多的解決方案。現在我想從上面的列表[輸出]和值作爲底盤,IP,機箱,掩碼,CP0,IP ,cp0,mask,cp0,gw,cp1,ip,cp1,mask,cp1,gw @WiktorStribiżew。 – Brock

+0

這已經是一個不同的問題。請考慮接受當前答案。 –

0

我有類似的周圍鋪設東西,並使用詞典涵蓋任何屬性:

(?P<name>^[A-Z0-9]+)\n|(?P<attr>^[\w]+[^:]+):\s(?P<val>[\d\w\.]+)\n 

在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 d 

Demo