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

标签 string regex string-matching

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

最佳答案

如果你使用 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'"]}

关于子模式\(.+\):

这看起来是一种处理嵌套括号的奇怪方法(因为贪婪的量词)。但如果括号之间只有一个值,则此子模式将给出预期结果。

新的正则表达式模块再次允许您重用子模式(在捕获组中定义),从而允许构建递归模式,例如:

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

(其中 (?1) 指捕获组 1 中的模式(子模式本身))

因此,您可以像这样重写子模式:

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

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

关于string - 捕获量化正则表达式中的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281096/

相关文章:

c# - 将列表的一部分复制到新列表

jQuery:将每个第 n 个单词包装在一个范围内

Java REGEX 运算符优先级

java Regex - 忽略引号?

c++ - 在 C++ 中使用循环查找字符串中的子字符串

string - 我可以在 bash/fishshell 中使用任何字符串操作命令/库吗?

php - 为什么 PHP 中两个字符串相加 "+"会产生这个结果?

regex - Powershell-正则表达式日期范围替换

正则表达式允许字符串只包含数字 0 - 9 并将长度限制为 45

r - 如何从 R 字符串中的多个列表中检测子字符串