计算器的思路主要是先用正则匹配出括号内的计算,然后用计算的结果将括号及内容整个替换掉,再匹配括号进行计算,替换,直至将括号内的计算全部完成

再者就是需要用正则匹配出乘除法先进行计算,再用正则匹配加减法进行计算,同时需要注意空格及符号的处理,如:++,—,/-,*-,或是负数开头的公式的计算

r"\d+(\.\d+)?/-\d+(\.\d+)?"    #匹配3/-2形式的整数或小数的乘除计算
r"\d+(\.\d+)?\*-\d+(\.\d+)?"    #匹配3*-2形式的整数或小数的乘除计算
r"\d+(\.\d+)?[/*]\d+(\.\d+)?"    #匹配正常的整数或小数的乘除计算
r"-\d+(\.\d+)?-\d+(\.\d+)?"    #匹配-3-2形式的整数或小数的加减计算
r"-\d+(\.\d+)?\+\d+(\.\d+)?"    #匹配-3+2形式的整数或小数的加减计算

具体如下:

import re

# func = "1 - 2 * ((60 - 30 + (-40 / 5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14))
#  - (-4 * 3) / (16 - 3 * 2))"
func = " 1+2*-(-3+2)/5.6+3"
func = func.replace(" ", "")
print(func)
print(1+2*-(-3+2)/5.6+3)


# 筛选内层括号及括号内容函数
def fun_inside(a):
    com = re.compile(r"\([^()]+\)")
    bracket = com.finditer(a)
    for j in bracket:
        yield j.group()


# 去空格,处理符号函数
def formatting(a):
    a = a.replace(" ", "")
    a = a.replace("++", "+")
    a = a.replace("--", "+")
    a = a.replace("+-", "-")
    a = a.replace("-+", "-")
    a = a.replace("*+", "*")
    a = a.replace("/+", "/")
    return a


# 括号内的乘除法
def cal_pursue_divide(a):
    s = re.findall("[*/]", a)
    s_list = re.split("[*/]", a)
    res = None
    for index, j in enumerate(s_list):
        if res:
            if s[index - 1] == "*":
                res *= float(j)
            elif s[index - 1] == "/":
                res /= float(j)
        else:
            res = float(j)
    return res


# 括号内的加减法
def cal_add_minus(a):
    s = re.findall("[+-]", a)
    s_list = re.split("[+-]", a)
    res = None
    for index, j in enumerate(s_list):
        if res:
            if s[index - 1] == "+":
                res += float(j)
            elif s[index - 1] == "-":
                res -= float(j)
        else:
            res = float(j)
    return res


# 四则运算包含特殊的"-","*-","/-","-"开头等
def cal_in_four(a):
    while True:
        if re.search(r"[/*]", a):   # 先计算乘除法
            a = formatting(a)
            if re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a) or \
                    re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a):  # 整数或小数
                # 计算 3/-2 类型
                if re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a):  # 整数或小数
                    result_high = re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a)
                    ret = result_high.group().replace("/-", "/")
                    res = cal_pursue_divide(ret)
                    a = a.replace(result_high.group(), "-" + str(res))

                # 计算 3*-2 类型
                elif re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a):  # 整数或小数
                    result_high = re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a)
                    ret = result_high.group().replace("*-", "*")
                    res = cal_pursue_divide(ret)
                    a = a.replace(result_high.group(), "-" + str(res))

            # 正常的乘除计算
            else:
                if re.search(r"\d+(\.\d+)?[/*]\d+(\.\d+)?", a):  # 整数或小数
                    result_high = re.search(r"\d+(\.\d+)?[/*]\d+(\.\d+)?", a)
                    res = cal_pursue_divide(result_high.group())
                    a = a.replace(result_high.group(), str(res))

        # 计算加减法
        elif re.search(r"[+-]", a[2:]):
            a = formatting(a)
            # 计算"-"开头的加减法
            if a[1:].startswith("-") or a.startswith("-"):
                # 计算 -3-2 类型
                if re.search(r"-\d+(\.\d+)?-\d+(\.\d+)?", a):  # 整数或小数
                    result_low = re.search(r"-\d+(\.\d+)?-\d+(\.\d+)?", a)
                    ret = result_low.group()[1:]
                    res = cal_add_minus(ret.replace("-", "+"))
                    a = a.replace(result_low.group(), "-" + str(res))

                # 计算 -3+2 类型
                elif re.search(r"-\d+(\.\d+)?\+\d+(\.\d+)?", a):  # 整数或小数
                    result_low = re.search(r"-\d+(\.\d+)?\+\d+(\.\d+)?", a)
                    ret = result_low.group()[1:]
                    res = cal_add_minus(ret.replace("+", "-"))
                    a = a.replace(result_low.group(), "-" + str(res))

            # 计算正常的加减法
            else:
                if re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a):  # 整数或小数
                    result_low = re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a)
                    res = cal_add_minus(result_low.group())
                    a = a.replace(result_low.group(), str(res))

        else:
            if re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a):  # 整数或小数
                result_low = re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a)
                res = cal_add_minus(result_low.group())
                a = a.replace(result_low.group(), str(res))
                return a
            else:
                return a


# 计算器函数
def calculator(s):
    while True:
        if re.search(r"\(.+\)", s):
            ret_receive_view = fun_inside(s)
            for i in ret_receive_view:
                ret = cal_in_four(i).replace("(", "").replace(")", "")
                s = s.replace(i, ret)
        else:
            result = cal_in_four(s)
            result = formatting(result)
            s = formatting(result)
            if s.startswith("+"):
                return "结果是:" + s[1:]
            else:
                return "结果是:" + s


sr = calculator(func)
print(sr)
计算器

相关文章:

  • 2021-12-02
  • 2021-08-29
  • 2021-04-02
  • 2021-10-11
  • 2022-12-23
  • 2022-12-23
  • 2022-02-20
猜你喜欢
  • 2021-07-29
  • 2022-12-23
  • 2022-02-15
  • 2022-12-23
  • 2021-12-10
  • 2021-07-19
相关资源
相似解决方案