用于匹配完整任意长度类型的LDAP名称的正则表达式
我正在尝试使用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)
这个部分可以匹配 cn
、ou
或 dc
中的任何一个。
[^,"]+
这个部分可以匹配除了 ,
和 "
以外的任何字符。
1
如果我理解正确的话,你想要从像这样的字符串中提取每个元素的名称和值:
CN=Server001,OU=SomeOU,DC=MyDom,DC=org
下面这个正则表达式就是一种实现方法。要注意,最后的逗号是可选的(最好在它前面加一个单词边界),否则你可能会漏掉最后一个元素:
(cn|ou|dc)=([\w-]+)\b,?
每个项目的名称在捕获组1中,值在组2中。你也知道,这需要忽略大小写的标志。
“注意这些LDAP名称可以包含空格,所以空白字符的搜索基本上没什么用”
我不太明白。你发的示例输入中没有空格。