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 に答える