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



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

我想用其他东西替换"Test( ... (",所以最好是一种模式,这样我就可以使用regex.sub().

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

当您需要使用子例程时,就是这种情况。在这里,您需要将递归模式包含在捕获组中,然后使用(?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))*- 零个或多个重复
      • [^()]++- 除()以外的1+字符(所有格匹配以提高效率(
      • |- 或
      • (?1)- 递归的子例程 捕获组 #1 子模式
    • )- 一个)字符。

最新更新