正则分割含嵌套括号的表达式:匹配完整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
相关产品推荐
相关产品推荐

