2012-12-03 33 views
0

我想匹配所有給出mac地址的dhcp租約。Dhcpd在python中使用正則表達式匹配?

我寫了這個代碼

fh = open(leaseFile) 
lines = fh.read() 
fh.close() 
regex = r"lease\s*[0-9\.]+\s*\{[^\{\}]*%s[^\{\}]*?\}" % maC#mac comes as parameter 
m = re.findall(regex,lines,re.DOTALL) 

這個工作好,如果租賃不包含「}」字符。但如果是這樣,我的正則表達式失敗。 例如:

lease 10.14.53.253 { 
    starts 3 2012/10/17 09:27:20; 
    ends 4 2012/10/18 09:27:20; 
    tstp 4 2012/10/18 09:27:20; 
    binding state free; 
    hardware ethernet 00:23:18:62:31:5b; 
    uid "\001\000\013OW}k"; 
} 

我找不出如何處理這個異常。感謝您的任何意見...

編輯

研究之後,我決定用這個表達式具有多模式。它適用於我嘗試的所有租賃。

fh = open(leaseFile) 
lines = fh.read() 
fh.close() 
regex = r"lease\s*[0-9\.]+\s*\{[^\{\}]*%s[\s\S]*?^\}" % maC#mac comes as parameter 
m = re.findall(regex,lines,re.MULTILINE) 
+0

請參閱[刪除從dhcpd.leases使用python mac給予mac的租約](http://stackoverflow.com/questions/13623593/13624313#13624313)。不要使用正則表達式來執行此任務,這不是正則表達式問題。 –

+0

我知道。這個問題也是我的。但我無法使用pyparsing。 – ibrahim

+0

我知道這是你的問題。問題在於,像[HTML和XML](http://stackoverflow.com/a/1732454/100297)這樣的DHCP租約是解析正則表達式的困難任務。您不應該爲此任務使用正則表達式。如果必須使用逐行閱讀,但正則表達式不會爲您解決這個問題。使用專用的解析器或pyparsing反而會更容易*。 –

回答

2
regex = r'(lease\s*[0-9\.]+\s*\{[^\{\}]*%s[^\{\}]*(.*"[^\{\}]*\}|\}))' % maC#mac comes as parameter 
m = re.findall(regex,lines) 

這應該做的伎倆。