You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则分割含嵌套括号的表达式:匹配完整sqrt(...)内容

解决嵌套括号的sqrt片段分割问题

你的问题核心是正则的非贪婪匹配无法处理嵌套括号,导致只能匹配到第一个)。下面提供两种可靠的解决方案:

方案1:使用支持递归匹配的正则库(Python regex)

Python标准库re不支持递归匹配嵌套结构,但第三方库regex可以。用递归正则匹配对应深度的括号:

代码实现

import regex

expr = "10+sqrt(10+(100*20)+20)+sqrt(5)"
# 递归正则:匹配sqrt(...),支持内部嵌套括号
pattern = r'(sqrt\()((?:[^()]|(?R))*)(\))'

result = []
prev_pos = 0
for match in regex.finditer(pattern, expr):
    # 添加匹配前的非sqrt部分
    if match.start() > prev_pos:
        result.append(expr[prev_pos:match.start()])
    # 拆分sqrt的各部分加入结果
    result.append(match.group(1))
    result.append(match.group(2))
    result.append(match.group(3))
    prev_pos = match.end()
# 处理表达式末尾剩余内容
if prev_pos < len(expr):
    result.append(expr[prev_pos:])

print(result)

输出结果:

['10+', 'sqrt(', '10+(100*20)+20', ')', '+', 'sqrt(', '5', ')']

方案2:手动遍历解析(无第三方依赖)

如果不想引入额外库,手动遍历字符串并跟踪括号深度,能精准定位嵌套括号的闭合位置:

代码实现

expr = "10+sqrt(10+(100*20)+20)+sqrt(5)"
result = []
length = len(expr)
current_idx = 0

while current_idx < length:
    # 查找下一个sqrt(的起始位置
    sqrt_start = expr.find('sqrt(', current_idx)
    if sqrt_start == -1:
        # 剩余所有内容加入结果
        result.append(expr[current_idx:])
        break
    
    # 添加sqrt(之前的片段
    if sqrt_start > current_idx:
        result.append(expr[current_idx:sqrt_start])
    
    # 加入sqrt(部分
    result.append('sqrt(')
    current_idx = sqrt_start + 5  # 跳过"sqrt("的5个字符
    
    # 跟踪括号深度,找到对应的闭合)
    bracket_depth = 1
    while current_idx < length and bracket_depth > 0:
        if expr[current_idx] == '(':
            bracket_depth += 1
        elif expr[current_idx] == ')':
            bracket_depth -= 1
            if bracket_depth == 0:
                # 加入括号内的内容和闭合)
                result.append(expr[sqrt_start+5:current_idx])
                result.append(')')
                current_idx += 1
                break
        current_idx += 1

print(result)

这段代码同样能输出你期望的结果,且兼容性更强,不需要额外安装库。

内容的提问来源于stack exchange,提问作者Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:45:37