用于解析SDDL的正则表达式

4
我正在使用Python和正则表达式解析SDDL。SDDL的格式始终为“type:some text”,最多重复4次。类型可以是'O'、'G'、'D'或'S',后跟一个冒号。'some text'的长度可变。
以下是一个示例SDDL:
O:DAG:S-1-5-21-2021943911-1813009066-4215039422-1735D:(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)S:NO_ACCESS_CONTROL

目前为止,我已经有了以下内容。其中两个元组能够正常返回,但另外两个元组——('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)')]

what I'd like to have returned is

[('O', 'DA'), ('G','S-1-5-21-2021943911-1813009066-4215039422-1735'), ('D', '(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)'),('S','NO_ACCESS_CONTROL')]
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()不会返回重叠的匹配,所以需要每个匹配在下一个匹配开始之前停止。

先行断言(?=.:|$)的意思是"仅当下一个字符为任何内容后跟冒号,或者我们已经到达字符串的末尾时才匹配"。


你比我快。我刚要提交了。回答很好。这是正则表达式的解释:http://regex101.com/r/uI4qX0 - Firas Dib
@Lindrian - 感谢提供链接,我以前没有使用过regex101.com,看起来是一个很棒的工具! - Andrew Clark
您甚至可以要求SDDL类型为O、G、D、S之一:([OGDS]):(.*?)(?=[OGDS]:|$) - Jonathon Reinhart

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接