Python编写数学表达式拆分函数输出异常原因咨询
Python括号匹配函数异常输出原因分析
问题背景
尝试编写Python自定义函数实现数学表达式拆分:接收字符串输入,将表达式拆分为片段存入数组。以(1+2)+(2+4)为例,预期拆分结果为["(1+2)", "+", "(2+4)"]。
当前暂未实现括号间运算符的提取逻辑,优先验证括号片段识别功能时,出现了不符合预期的输出。
现有实现代码
def crush(string): crushed_string = [] for i in range(0, len(string)): current_problem = "" if string[i] == "(": for x in range(i, len(string)): if string[x] == ")": for y in range(i, x+1): current_problem += string[y] print(current_problem) string = "(1+2)+(3+4)" crush(string)
实际运行输出
(1+2) (1+2)(1+2)+(3+4) (3+4)
异常产生的具体原因
异常由两个逻辑漏洞共同导致:
- 内层右括号匹配循环没有终止逻辑
最外层i循环逐字符遍历字符串,当i定位到一个左括号(后,内层x循环会从当前左括号位置向后遍历所有字符,每遇到一个右括号就会执行一次拼接打印,且打印后不会跳出循环,会继续向后找更多右括号。
以测试用例(1+2)+(3+4)为例:当i=0(定位到第一个左括号)时,x首先走到索引4位置的第一个右括号,此时完成第一次拼接打印;但x循环不会停止,会继续向后遍历,直到走到索引9位置的第二个右括号,再次触发拼接打印逻辑。 - 临时拼接变量的重置时机错误
current_problem作为存储单次括号匹配结果的临时变量,被放在最外层i循环的开头初始化,这意味着:同一个i对应的内层x循环多次触发拼接逻辑时,current_problem不会被清空,上一次拼接的内容会残留。
还是以i=0的场景为例:第一次匹配到索引4的右括号时,current_problem被赋值为(1+2)并打印;后续匹配到索引9的右括号时,程序会再次把索引0到9的所有字符(1+2)+(3+4)拼接到已经存有(1+2)的current_problem后面,最终打印出异常的(1+2)(1+2)+(3+4)。
当最外层i循环走到索引6位置(定位到第二个左括号)时,内层x循环匹配到索引9的右括号,拼接出(3+4)打印,就是输出的第三行内容。
注:当前逻辑仅会匹配左括号和其后方出现的右括号,还未处理括号嵌套、配对校验等场景,后续开发运算符提取逻辑时可以一并调整。
内容的提问来源于stack exchange,提问作者CapnCoin
相关产品推荐
相关产品推荐

