4

私はPythonを使用して、正規表現を使用してSDDLを解析しています。SDDL は常に「type:some text」の形式で、最大 4 回繰り返されます。タイプは、「O」、「G」、「D」、または「S」のいずれかで、その後にコロンが続きます。「一部のテキスト」の長さは可変です。

サンプルの SDDL を次に示します。

O:DAG:S-1-5-21-2021943911-1813009066-4215039422-1735D:(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)S:NO_ACCESS_CONTROL

これが私がこれまでに持っているものです。2 つのタプルは問題なく返されますが、他の 2 つ ('G','S-1-5-21-2021943911-1813009066-4215039422-1735') と ('S','NO_ACCESS_CONTROL') は返されません。

import re

sddl="O:DAG:S-1-5-21-2021943911-1813009066-4215039422-1735D:(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)S:NO_ACCESS_CONTROL"

matches = re.findall('(.):(.*?).:',sddl)

print matches

[('O', 'DA'), ('D', '(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)')]

私が返したかったのは

[('O', 'DA'), ('G','S-1-5-21-2021943911-1813009066-4215039422-1735'), ('D', '(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)'),('S','NO_ACCESS_CONTROL')]
4

2 に答える 2

2

次のことを試してください。

(.):(.*?)(?=.:|$)

例:

>>> re.findall(r'(.):(.*?)(?=.:|$)', sddl)
[('O', 'DA'), ('G', 'S-1-5-21-2021943911-1813009066-4215039422-1735'), ('D', '(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)'), ('S', 'NO_ACCESS_CONTROL')]

この正規表現はあなたのものと同じように始まりますが、一致の一部として最後に を含める代わりに.:、先読みが使用されます。は重複する一致を返さないためre.findall()、これが必要です。そのため、次の一致が始まる前に各一致を停止する必要があります。

先読みは基本的に、「次の文字の後にコロンが続く場合、または文字列の末尾にいる(?=.:|$)場合にのみ一致する」ことを意味します。

于 2012-08-27T18:07:48.330 に答える
0

正規表現を使用することは、この問題に対する最善の解決策ではないようです。本当にやりたいことは、コロンで分割し、結果のリストに対していくつかの変換を行うことだけです。

chunks = sddl.split(':')
pairs = [(chunks[i][-1], chunks[i+1][:-1] \
                             if i < (len(chunks) - 2) \
                             else chunks[i+1]) 
               for i in range(0, len(chunks) - 1)]
于 2012-08-27T18:25:37.743 に答える