2013-12-08 30 views
1
Device ID: xyz 
Entry address(es): 
IP address: 10.3.10.46 
Platform: WS-x, Capabilities: Switch IGMP 
Interface: GigabitEthernet9/33, Port ID (outgoing port): GigabitEthernet0/2 
Holdtime : 177 sec 
Management address(es): 
IP address: 10.3.10.46 

符合使用正则表达式换行符后跟一个字符串以上是从一个file.From上述之中的snipet我想通过匹配只有下面的2行收集的IP地址。 入口地址(ES): IP地址:10.3.10.46 或 管理地址(ES): IP地址:10.3.10.46我想在python

正则表达式我已经写了如下不工作,我无法解决我在正则表达式中如何显示“address(es):”后新行

f = open(fileName) 
for line in f: 
    matchObj1 = re.match(r'Entry address\(es\):\s+IP address: ([0-9.]+)', line) 
    if matchObj1: 
    print "IP Address = ", matchObj1.group(1) 

    matchObj2 = re.match(r'Entry address\(es\):\s+IP address: ([0-9.]+)', line) 
    if matchObj2: 
    print "IP Address = ", matchObj2.group(1) 

请帮忙。谢谢。

回答

0

您不需要为此使用正则表达式。您的输入看起来像配置文件或程序的输出,并且易于解析。

def get_addresses(fname): 
    addresses = {} 
    with open(fname) as f: 
     lines = [l.strip().lower() for l in f] 

    for i, line in enumerate(lines): 
     if line.startswith("ip address"): 
      ip = line.split(": ")[1] 
      address_type = lines[i-1] 
      if address_type == "entry address(es):": 
       addresses["entry"] = ip 
      elif address_type == "management address(es):": 
       addresses["management"] = ip 
      # Add additional address type handling here 

    return addresses 
+0

感谢您的回复,但问题出现在我有“输入地址:”后面跟着IP地址和“管理地址:”后跟同样格式的IP地址。所以我在找什么,是匹配使用正则表达式'\ n'分隔的2行 –

+0

你仍然不需要一个正则表达式来做到这一点(看看我编辑的答案)。 –

1

您需要使用re.search代替re.matchre.match用于从字符串的开头匹配:只在的开始

re.match()检查匹配:

>>> s = 'Device ID: xyz\nEntry address(es): \n  IP address: 10.3.10.46\n Platform: WS-x, Capabilities: Switch IGMP \n Interface: GigabitEthernet9/33, Port ID (outgoing port): GigabitEthernet0/2\n Holdtime : 177 sec' 
>>> re.search(r'Entry address\(es\):\s+IP address: ([0-9.]+)', s).group(1) 
'10.3.10.46' 

search() vs. match()字符串, 而re.search()检查字符串中任何位置的匹配。