仅在递归之前的匹配开始时具有模式匹配的递归正则表达式?
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 子模式的子例程
\)
- 一个 )
个字符。
我正在尝试找到匹配的括号,中间还有一些括号。我有以下正则表达式,它与括号匹配以找到与之关联的括号。我现在需要的是它还搜索一个前缀,例如 "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 子模式的子例程
\)
- 一个)
个字符。