2

我有多个带有 LDAP 条目的日志文件,我试图仅匹配在某个日期具有 createtimestamp 的条目,但捕获整个条目,而不仅仅是时间戳。条目如下:

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 要么得到不需要的条目。有任何想法吗?

4

2 回答 2

2

不要尝试手动解析 LDIF。这并不复杂,但是属性和名称转义以及长行的续行之类的东西会咬你。使用来自 python-ldap 的 LDIF 解析器

于 2013-06-23T22:36:50.863 回答
2

描述

此正则表达式将假定每组文本dn:以空行开头和结尾。然后它将捕获整个行组,并捕获该createtimestamp字段的值

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

在此处输入图像描述

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
于 2013-06-23T20:53:39.517 回答