用于匹配完整任意长度类型的LDAP名称的正则表达式

0 投票
2 回答
1414 浏览
提问于 2025-04-17 22:52

我正在尝试使用Python 3.4.0从一个日志文件中提取带类型的LDAP FDN(全名),我需要检查每一行是否有匹配的内容。不过,我试过的正则表达式模式都没有用。我需要找到完整的FDN,不管FDN的第一个元素是什么类型(比如DC、OU、CN)。

log_line1 = 'This server name is "CN=Server001,OU=SomeOU,DC=MyDom,DC=org".'
log_line2 = 'Whereas this server is called "cn=Server002,ou=SubContainer,ou=Elsewhere,dc=SubDomain,dc=MyDom,dc=org" and "something else" is also in quotes most likely.'

我可以接受自己找到FDN的每个元素并把它们拼接起来。我目前找到的最接近的方式是这个,它几乎可以找到字符串中的每个单词:

>>> ldappattern = re.compile("cn=[\w-]+,|ou=[\w-]+,|dc=[\w-]+,", re.IGNORECASE)
>>> re.findall(ldappattern, log_line1)
['This', 'server', 'name', 'is', 'CN=Server001,', 'OU=SomeOU,', 'DC=MyDom,', 'DC=org']

需要注意的是,这些LDAP名称可能包含空格,所以用空格来搜索基本没用。而且我不能保证最后一个元素会是任何合理的东西(比如,我见过'DC=testcompany,DC=internal'作为域的根元素,甚至还有单标签的DNS名称)。它们应该用引号括起来,但在某一行中,它们不一定是唯一的引号内容。

有没有什么好的想法?

2 个回答

0

我建议你在写正则表达式的时候,始终使用原始字符串,这样可以避免一些意想不到的问题。接下来,我推荐你使用这个正则表达式:

(?:cn|ou|dc)=[^,"]+

这是一个正则表达式的演示

这是另一个演示

我使用单引号来定义正则表达式字符串,这样就不需要对里面的双引号进行转义了。

(?:cn|ou|dc) 这个部分可以匹配 cnoudc 中的任何一个。

[^,"]+ 这个部分可以匹配除了 ," 以外的任何字符。

1

如果我理解正确的话,你想要从像这样的字符串中提取每个元素的名称和值:

CN=Server001,OU=SomeOU,DC=MyDom,DC=org

下面这个正则表达式就是一种实现方法。要注意,最后的逗号是可选的(最好在它前面加一个单词边界),否则你可能会漏掉最后一个元素:

(cn|ou|dc)=([\w-]+)\b,?

正则表达式可视化

Debuggex 演示

每个项目的名称在捕获组1中,值在组2中。你也知道,这需要忽略大小写的标志。

“注意这些LDAP名称可以包含空格,所以空白字符的搜索基本上没什么用”

我不太明白。你发的示例输入中没有空格。

撰写回答