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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:19:35