我试图使用正则表达式从字符串中捕获重复的模式。更准确地说,我正在尝试解析LDAP模式定义。
一个示例字符串:
( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
与字符串和所有相关组件匹配的正则表达式(Python /扩展正则表达式)为:
^\( (?P<oid>\d+(\.\d+)*) ((?P<keyword>[A-Z-]+) (?P<value>[^' ]+|'[^']+'|\(.+\)) )+\)$
我已经命名了相关的匹配组。问题是我如何捕获P和P的所有出现?默认情况下,仅捕获最后一次出现,而其他仅匹配。
如果您使用新的regex模块,则可以使用一种方法来存储重复捕获组的结果,例如:
import regex
line = '''( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )'''
pattern = r'''(?x) # switch the VERBOSE (free-spacing) mode on
^
\( [ ]*
(?P<oid>\d+(?:\.\d+)*) \s+ # use a non-capturing group when there is
(?: # no need to capture something
(?P<keyword>[A-Z-]+) [ ]+
(?P<value> [^' ]+ | '[^']*' | \(.+\)) [ ]*
)+
\)
$
'''
m = regex.match(pattern, line)
print m.capturesdict()
您获得:
{'oid': ['1.3.6.1.4.1.1466.115.121.1.8'], 'keyword': ['DESC', 'X-BINARY-TRANSFER-REQUIRED', 'X-NOT-HUMAN-READABLE'], 'value': ["'Certificate'", "'TRUE'", "'TRUE'"]}
关于子模式\(.+\)
:
看起来似乎是一种奇怪的处理嵌套paren的方法(由于贪婪的量词)。但是,如果paren之间只有一个值,则该子模式将提供预期的结果。
再有一次,新的正则表达式模块使您可以重用子模式(在捕获组中定义),从而可以构建递归模式,例如:
(\((?>[^()]+|(?1))*\))
(其中(?1)
指的是捕获组1中的模式(子模式本身))
因此,您可以像这样重写value子模式:
(?P<value> [^' ]+ | '[^']*' | (\((?>[^()]+|(?1))*\)) )
注意:但是,如果您不打算处理嵌套的括号,请忘记使用它 \([^)]*\)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句