1

我试图找到匹配的括号,中间还有一些括号。我有以下正则表达式可以做到这一点,它匹配括号以找到与之关联的那个。我现在需要的是它还搜索前缀,例如“测试”。然而,它会递归整个模式。我不能简单地在模式的开头包含“测试”。我也只希望它在前缀以“Test”开头时匹配,而不仅仅是匹配任何括号。

我想用其他东西替换“Test(...)”,所以如果它是一种模式会更好,这样我就可以使用regex.sub().

import regex

# want to match 'Test(' prefix specifically
regex.search('\(([^()]|(?R))*\)', '... () ... Test(123, Test(123, (3), 3))')  
4

1 回答 1

0

当您需要使用子例程时就是这种情况。在这里,您需要将递归模式包含在捕获组中,然后使用(?1)构造对其进行递归:

import regex
m = regex.search(r'Test(\((?:[^()]++|(?1))*\))', 'Test(123, Test(123, (3), 3))')
if m:
    print(m.group()) # => Test(123, Test(123, (3), 3))

请参阅Python 演示

细节

  • Test- 前缀词
  • (\((?:[^()]++|(?1))*\)) - 捕获组 1(将使用 递归(?1)):
    • \(- 一个(字符
    • (?:[^()]++|(?1))*- 零次或多次重复
      • [^()]++(- 除and以外的 1+ 个字符)(所有匹配以提高效率)
      • |- 或者
      • (?1)- 递归捕获组#1 子模式的子程序
    • \) - 一个)字符。
于 2018-05-22T21:03:13.640 回答