仅在递归之前的匹配开始时具有模式匹配的递归正则表达式?

Recursive Regex with a Pattern Matching only on Start of Match before Recursion?

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

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

import regex

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

那就是需要用到subroutines的时候。在这里,您需要将递归模式包含在捕获组中,然后使用 (?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 demo

详情

  • Test - 前缀词
  • (\((?:[^()]++|(?1))*\)) - 捕获第 1 组(将用 (?1) 递归):
    • \( - 一个 ( 字符
    • (?:[^()]++|(?1))* - 零次或多次重复
      • [^()]++ - 除了 () 之外的 1+ 个字符(占有匹配以提高效率)
      • | - 或
      • (?1) - 递归捕获组 #1 子模式的子例程
    • \) - 一个 ) 个字符。