Python字符串数学指令转公式功能的异常问题求助
Python字符串数学指令转公式功能的异常问题求助
我正在开发一个功能,需要把字符串形式的数学指令转换成标准的数学公式,具体是处理DataFrame中的一列指令字符串,生成对应公式的新列。
举个理想的转换例子:
div(mul(mstr,mul(div(baseline_year,transaction_yr),spnd_val)),1000)→((mstr*((baseline_year*transaction_yr)/spnd_val))/1000)
我当前的实现代码
import re import pandas as pd def get_operations(calculation): # 匹配所有add、mul、div、sub操作 operations = re.findall(r'\b(add|mul|div|sub)\b', calculation) return operations def sort_operations(operations): # 按运算优先级排序 priority = {'mul': 1, 'div': 2, 'add': 3, 'sub': 4} return sorted(operations, key=lambda op: priority[op]) # 生成公式并更新新列的函数 def replace_operations(expression): # 定义各操作的正则匹配规则 patterns = { 'mul': re.compile(r'mul\(([^,]+),([^)]+)\)'), 'div': re.compile(r'div\(([^,]+),([^)]+)\)'), 'add': re.compile(r'add\(([^,]+),([^)]+)\)'), 'sub': re.compile(r'sub\(([^,]+),([^)]+)\)') } # 替换匹配到的操作符为对应数学运算 def replace(match): op = match.group(0) if 'mul' in op: return f"({match.group(1)}*{match.group(2)})" elif 'div' in op: return f"({match.group(1)}/{match.group(2)})" elif 'add' in op: return f"({match.group(1)}+{match.group(2)})" elif 'sub' in op: return f"({match.group(1)}-{match.group(2)})" # 按BODMAS顺序应用替换 priority = {'mul': 1, 'div': 2, 'add': 3, 'sub': 4} while any(pattern.search(expression) for pattern in patterns.values()): print("pattern", any(pattern.search(expression) for pattern in patterns.values())) math_oprtrs = sort_operations(get_operations(expression)) print("math_operator",math_oprtrs) for key in math_oprtrs: print(expression,"pattern_for",patterns[key]) # 这里尝试过调整顺序 expression = patterns[key].sub(replace, expression) return expression # 测试用DataFrame data = {'expression': ['div(mul(mul(div(baseline_year,transaction_year),mstr),spnd_val),1000)']} df = pd.DataFrame(data) # 应用函数生成新列 df['updated_expression'] = df['expression'].apply(replace_operations) display(df)
遇到的问题
- 当指令仅包含两个参数的简单操作时,代码能正常运行;但如果是嵌套更深或包含多个连续操作的复杂指令,就会输出错误的公式结果
- 部分场景下,代码没有严格遵循BODMAS运算优先级规则,导致生成的公式逻辑不符合预期
我已经尝试调整过操作的排序优先级,但问题依然存在,希望有人能帮忙排查一下问题所在?
备注:内容来源于stack exchange,提问作者user8423971
相关产品推荐
相关产品推荐

