Skip to main content
 首页 » 编程设计

python之使用 Python 和正则表达式解析 dhcpd.leases

2025年05月04日37lautakyan007

我们正在努力解决一些 DHCP 问题,我正在使用 Python 和正则表达式来解析 dhcpd.leases 文件。我想编写一个正则表达式来捕获每个租约(请参阅底部的文件示例) block ,然后捕获 IP 地址和 MAC。我的正则表达式知识很初级,但我认为我走在正确的轨道上。到目前为止,我没有捕捉到所有内容:

到目前为止的代码:

import sys, re 
 
fp = '/Users/smitty/Dropbox/Company/Network/DHCP-Info/dhcpd.leases' 
f = open(fp) 
ftext = f.read() 
 
p = re.compile(ur'(lease\s([\d]*.*).*\n.*\n.*\n.*\n.*\n.*ethernet\s(.*);*.\n.*\n.*})') 
 
raw_record = [] 
 
parsed_record = {} 
 
for match in re.findall(p, ftext): 
    raw_record.append(match) 
 
for record in raw_record: 
    m = re.search(p, record) 
    parsed_record[m.group(2)] = m.group(3) 
 
plaintext_record = [] 
 
for ip, mac in parsed_record.iteritems(): 
    plaintext_record.append("IP: {0}   MAC: {1}".format(ip, mac)) 

dhcpd.leases 文件的示例 block :

lease 192.168.124.118 { 
  starts 1 2014/12/01 12:42:49; 
  ends 1 2014/12/01 20:42:49; 
  tstp 1 2014/12/01 20:42:49; 
  binding state free; 
  hardware ethernet 00:0c:29:d5:ff:cb; 
  uid "\001\000\014)\325\377\313"; 
} 
lease 192.168.124.117 { 
  starts 5 2015/05/01 18:49:10; 
  ends 6 2015/05/02 02:49:10; 
  tstp 6 2015/05/02 02:49:10; 
  binding state free; 
  hardware ethernet 00:0c:29:85:6f:62; 
  uid "\001\000\014)\205ob"; 
} 
lease 192.168.124.116 { 
  starts 5 2015/06/05 14:48:40; 
  ends 5 2015/06/05 22:48:40; 
  tstp 5 2015/06/05 22:48:40; 
  binding state free; 
  hardware ethernet 00:0c:29:d1:3e:0d; 
  uid "\001\000\014)\321>\015"; 
} 
lease 192.168.123.200 { 
  starts 5 2012/07/13 11:54:46; 
  ends 5 2012/07/13 11:57:42; 
  tstp 5 2012/07/13 11:57:42; 
  binding state free; 
  hardware ethernet 88:c6:63:c6:08:52; 
  uid "\001\210\306c\306\010R"; 
} 

我也忍不住觉得我对这里的约定(创建一个列表,然后是一个字典,然后又是一个列表)感到无所适从。

请您参考如下方法:

打开“多行”模式以简化表达式并避免检查租约内的每个换行符并将 IP 和 MAC 地址捕获到保存组中:

import re 
 
pattern = re.compile(r"lease ([0-9.]+) {.*?hardware ethernet ([:a-f0-9]+);.*?}", re.MULTILINE | re.DOTALL) 
 
with open("/Users/smitty/Dropbox/Company/Network/DHCP-Info/dhcpd.leases") as f: 
    for match in pattern.finditer(f.read()): 
        print(match.group(1), match.group(2)) 

打印:

192.168.124.118 00:0c:29:d5:ff:cb 
192.168.124.117 00:0c:29:85:6f:62 
192.168.124.116 00:0c:29:d1:3e:0d 
192.168.123.200 88:c6:63:c6:08:52