2016-03-29 23 views
1

私たちはいくつかのDHCPの問題を解決するために取り組んでいます。私はPythonと正規表現を使ってdhcpd.leasesファイルを解析しています。私は各リース(下のファイルサンプルを参照)ブロックをキャプチャし、IPアドレスとMACをキャプチャする単一の正規表現を作成します。私の正規表現の知識は初歩的ですが、私は正しい道にいると思います。私も助けることは感じることができないPythonとRegexでdhcpd.leasesを解析する

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"; 
} 

コードこれまで:dhcpd.leasesファイルの名前の

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)) 

サンプルブロックIは、これまでのすべてのものをキャプチャされていない持っているもの私はここで大会に関するすべての場所にいるようです(リストを作成してから辞表を作成してからリストを作成します)。

答えて

2
を式を簡素化し、リース内のすべての改行をチェック避け、グループの保存に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 
+1

2番目のグループについては、MACアドレスが16進数であるため、 '[:a-f0-9]'に変更したいと思うかもしれません。また、(@ P [0-9。] +) '...ちょうど意見の問題 –

+1

の@IronFistのような一致するグループ名を与えることは良いアイデアだと思います。ありがとう! – alecxe

+2

私はこれが好きです - 今それを試してみてください........素晴らしい。以前は 're.MULTILINE'と' re.DOTALL'に慣れていませんでした 私はこのスクリプトをlinuxで呼び出されたいくつかのコマンドラインbashと組み合わせて使用​​し、ネットワークの解きほぐし(論理的な解きほぐし)を効率化します。 Muchas gracias、danke、grazie、merci、そしてそのすべて。 @IronFist - 私ができる場合は、私はプラス1 – Smitty

1

は私がわずかに異なる解決策を持っている:

import re 

rx = re.compile(r"(?<=lease)(\S+).*?(\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}).*?(?=\})", 
       re.IGNORECASE | re.DOTALL | re.MULTILINE) 

plaintext_record = [] 

with open('data.txt', 'r') as fp: 
    data = fp.read() 

    for m in rx.finditer(data): 
     plaintext_record.append('IP: {0} MAC: {1}'.format(m.group(1), m.group(2))) 

for item in plaintext_record: 
    print(item) 

あなたがコードをやっていると、ファイルdata.txtに保存されたサンプルデータに基づいて、このアプリケーションはplaintext_record配列内のIP、MACのペアを格納します。

plaintext_recordを印刷:

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

あなたはすでに正規表現パターンを構築しているので、なぜre.find 'rx.finditer'ではなく' iter'ですか? ...既にコンパイルされたパターンで高速になります。 –

+1

@IronFist良いキャッチコードを更新します。それを持っていただきありがとうございます。 – Saleem

関連する問題