gpt4 book ai didi

python - 用于解析 SDDL 的正则表达式

转载 作者:行者123 更新时间:2023-11-28 17:49:52 26 4
gpt4 key购买 nike

我正在使用 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

这是我目前所拥有的。其中两个元组返回得很好,但另外两个 - ('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')]

最佳答案

尝试以下操作:

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

例子:

>>> 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() 不会返回重叠的匹配项,因此您需要每个匹配项在下一个匹配项开始之前停止。

先行 (?=.:|$) 本质上意味着“仅当 下一个 字符后跟一个冒号,或者我们在末尾时才匹配字符串”。

关于python - 用于解析 SDDL 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com