Home Articles

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

Asked
Viewed 1195 times
1

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

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

import regex

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

1 Answer

  • 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 .

    Details

    • Test - 前缀词

    • (\((?:[^()]++|(?1))*\)) - 捕获组1(将使用 (?1) 递归):

    • \( - 一个 ( char

    • (?:[^()]++|(?1))* - 零或更多的

    • [^()]++ - 除了 () 之外的1个字符(占有率匹配以提高效率)

    • | - 或

    • (?1) - 一个递归捕获组#1子模式的子程序

    • \) - 一个 ) char .

Related