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

时间:2018-05-22 21:00:15

标签: python regex pypi-regex

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

我想替换"测试(...)"与其他东西相比,如果它是一种模式,那么它更可取,所以我可以使用regex.sub()

import regex

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

1 个答案:

答案 0 :(得分:0)

当您需要使用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子模式的子程序
    • \) - )字符。