捕获量化正则表达式中的所有匹配

问题描述:

我正在尝试使用正则表达式从字符串中捕获重复的模式。更确切地说,我试图解析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的出现?默认情况下,只有最后一次发生,而其他发生只有匹配。

+0

为什么你没有问在堆栈溢出? http://meta.stackexchange.com/a/129632/165773 – gnat 2014-12-03 15:19:35

+0

@gnat为什么我不应该问程序员? – 2014-12-03 15:46:48

+2

此问题属于*,因为它涉及实施问题。 – GlenH7 2014-12-03 15:49:10

你有办法,如果你使用的new regex module,它允许存储重复捕获组的结果,例如:

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'"]} 

关于子模式\(.+\)

它看起来像一个奇怪的方式来处理n ested parens(因为贪婪的量词)。但是,如果在parens之间只有一个值,这个子模式会给出预期的结果。

一个时间越长,新的正则表达式模块允许您重用一个子模式(在捕获组定义),允许建立一个递归模式,例如:

(\((?>[^()]+|(?1))*\)) 

(其中(?1)参照图案捕获1组(子模式本身))

所以,你可以重写子模式那样:

(?P<value> [^' ]+ | '[^']*' | (\((?>[^()]+|(?1))*\))) 

注意:但是,如果你不想处理嵌套括号,忘记和使用\([^)]*\)

+0

我只用'\(。+ \)'作为占位符,因为我还没有完成写入模式;)。 – 2014-12-05 12:50:31