2013-06-23 40 views
2

我有多個帶有LDAP條目的日誌文件,我試圖僅匹配在某個日期期間具有createtimestamp的條目,但捕獲整個條目,而不僅僅是時間戳。該分錄如下:與多行正則表達式匹配LDAP條目的問題

dn: .... 
otherattr: 
... 
createtimestamp: 20130621061525Z 

的問題是,我讓所有的一個我要和之前來的條目。

dn: .... 
otherattr: 
... 
createtimestamp: 20121221082545Z 

dn: .... 
otherattr: 
... 
createtimestamp: 20130621061525Z 

這是表達:

dn_search = re.compile(r'dn: (.*?)createtimestamp: 20130[4-6]\d+?Z', flags=re.M|re.S) 

我已經嘗試了一些其他的表情,但我要麼只得到了createtimestamp或不需要的條目。有任何想法嗎?

+1

爲什麼不抓取所有東西,將日期解析到日期時間對象中,然後對其進行過濾? – Ben

+1

@ Ben Yea,工作。我想我只是有正則表達式卡在我的腦海。謝謝。 – Adam

回答

2

說明

此正則表達式將假定每個組文本與dn:開始,並用一個空行結束。然後,它會捕捉線的整個組,並捕獲createtimestamp字段的值

^dn:(?=(?:(?!^createtimestamp:|^dn:|^\s*(?:\r|\n\|$)|\Z).)*^createtimestamp:\s*([^\s\r\n]*))(?:(?!^dn:|^\s*(?:\r|\n\|$)|\Z).)*

enter image description here

Python代碼例子

鏈接工作示例http://repl.it/J0t

代碼

import re 

string = """dn: .... 
otherattr: 
... 
createtimestamp: 20121221082545Z_1 

dn: .... 
otherattr: 
... 
createtimestamp: 20130621061525Z_2 
"""; 

for matchObj in re.finditer(r'^dn:(?=(?:(?!^createtimestamp:|^dn:|^\s*(?:\r|\n\|$)|\Z).)*^createtimestamp:\s*([^\s\r\n]*))(?:(?!^dn:|^\s*(?:\r|\n\|$)|\Z).)*', string, re.M|re.I|re.S): 
    print "-------" 
    print "matchObj.group(1) : ", matchObj.group(1) 

返回

------- 
matchObj.group(1) : 20121221082545Z_1 
------- 
matchObj.group(1) : 20130621061525Z_2 
+0

我似乎無法得到這個工作在Python中,但感謝信息。 – Adam

+0

這很奇怪,它在PHP中工作,但不是Python,哦。查看更新。 –

2

不要試圖用手來解析LDIF。這並不複雜,但像屬性和名稱轉義以及長行代碼的續行會咬你。使用。

+0

感謝有關python-ldap的信息。 – Adam