Python 正则表达式匹配完整、任意长度、全类型的LDAP名称
我正在尝试使用Python 3.4.0从日志文件中提取类型完整的LDAP FDN(检查每一行是否匹配)。但是,我尝试的正则表达式模式都不起作用。我需要能够找到完整的FDN,而不考虑FDN的第一个元素的类型(例如DC、OU、CN) 我可以找到FDN的每个元素并自己连接它们。我最接近的是这个,它几乎可以找到字符串中的每个单词:Python 正则表达式匹配完整、任意长度、全类型的LDAP名称,python,regex,ldap,Python,Regex,Ldap,我正在尝试使用Python 3.4.0从日志文件中提取类型完整的LDAP FDN(检查每一行是否匹配)。但是,我尝试的正则表达式模式都不起作用。我需要能够找到完整的FDN,而不考虑FDN的第一个元素的类型(例如DC、OU、CN) 我可以找到FDN的每个元素并自己连接它们。我最接近的是这个,它几乎可以找到字符串中的每个单词: >>> ldappattern = re.compile("cn=[\w-]+,|ou=[\w-]+,|dc=[\w-]+,", re.IGNORECASE
>>> 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名称)。它们应该在引号中,但它们不一定是给定行中引用的唯一内容
有什么想法吗?如果我理解您的意思,您希望在字符串中捕获每个元素的名称和值,例如:
CN=Server001,OU=SomeOU,DC=MyDom,DC=org
下面的正则表达式是一种方法。请注意,结尾逗号必须是可选的(最好在它前面添加一个单词边界),否则您将错过最后一个元素:
(cn|ou|dc)=([\w-]+)\b,?
每个项目的名称在捕获组1中,值在组2中。正如您所知,它需要ignorecase标志
请注意,这些LDAP名称可以包含空格,因此空格搜索非常无用
我不明白。您发布的演示输入不包含空格。我建议您始终绘制正则表达式字符串,以避免出现任何意外情况。也就是说,我会建议这个正则表达式:
(?:cn|ou|dc)=[^,"]+
我对正则表达式字符串使用了单引号,这样就不必转义正则表达式中的双引号
(?:cn | ou | dc)
匹配任何cn
、ou
或dc
[^,“]+
匹配除、
和之外的任何字符关于空格:CN=Server001,OU=Some OU,DC=MyDom,DC=org
也有效。但是,re.findall(((cn | ou | dc)=([\w\s-]+)\b,”,log\u line1)
返回一个元组列表:[('cn','Server001'),('ou','Some ou'),…]
,对于我的目的来说,它工作得很好。也许有一个更有效的答案,我希望有人能想出它,但我可以继续。只要将字符类从[\w-]
更改为[-\w]
,你就应该很好了。“rawing”是什么意思?@aliteralmind这意味着你不必双重转义。假设您要匹配一个反斜杠。您需要'\\\'
来匹配单个反斜杠。通过绘制字符串,可以使用'\\'
匹配单个反斜杠。看见
(?:cn|ou|dc)=[^,"]+