用python进行四则运算,下面的代码有些问题。但不知道出在哪里,有大神能给解惑吗?感谢留言。

该博客探讨了如何使用Python进行四则运算表达式的合法性检查和计算。通过正则表达式检查非法字符、括号匹配、中文括号等问题,并通过一系列函数处理表达式中的运算符和空格,实现乘除优先级计算,最后处理加减法。示例代码处理了一段复杂的四则运算表达式。
摘要由CSDN通过智能技术生成
 
import re
#检查输入是否有非法字符
def check_expreesion(st):
    string = True
    if re.findall('[a-z]+',st.lower()):
        print(re.findall('[a-z]+',st))
        print('表达式有非法字符')
        string = False
    if not st.count('(') == st.count(')'):
        print("表达式错误,括号未闭合")
        string = False
    if re.findall('[()]',st):
        print('表达式有中文括号')
        string = False
    if re.findall('(\/\*)',st):

        print('表达式/*同时连在一起了')
        string = False
    if re.findall('(\*\/)',st):

        print('表达式*/同时连在一起了')
        string = False

    return string

def format_str(st):
    st = st.replace('--', '+')
    st = st.replace('++', '+')
    st = st.replace('+-', '-')
    st = st.replace('*+', '*')
    st = st.replace('/+', '/')
    st = st.replace('-+', '-')
    st = st.replace(' ', '')
    return st

def cal_nul_div(st):
    regular = '[\-]?\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
    while re.findall(regular, st):
        expression = re.search(regular, st).group()
        #print(expression)
        #如果是乘法
        if expression.count("*")==1:
            x,y = expression.split("*")
            # print(x,y)
            mul_cal = str(float(x) * float(y))
            st = st.replace(expression,mul_cal)
            # print(st)

        if expression.count("/")==1:
            x, y = expression.split("/")
            # print(x, y)
            mul = str(float(x) / float(y))
            mul = st.replace(expression, mul)
            st = format_str(mul)
            # print(st)
        # if not re.findall('(\/|\*)',st):
        #     return st
    return st
    # print(st)

def add_sub(string):
    add_rule = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
    sub_rule = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
    while re.findall(add_rule, string):
        add = re.findall(add_rule,string)
        for i in add:
            x, y = i.split("+")
            sub = str(float(x) + float(y))
            sub = '+' + sub
        string = string.replace(i,sub)
        string = format_str(string)
        # print(string)
    while re.findall(sub_rule,string):
        sub = re.findall(sub_rule,string)
        # print(len(sub))
        for sub_str in sub:
            numbers = sub_str.split("-")
            if len(numbers) == 3:
                result = 0
                for v in numbers:
                    if v:
                        result -= float(v)
            else:
                x, y = numbers
                result = float(x) - float(y)
            string = string.replace(sub_str, "+" + str(result))
        string = format_str(string)
        # print(string)
    return string

if __name__ =="__main__":
    formula = ' 2 -3+(-9-2+3*5/4-3+5+(-1+4.3/2-3.5+2.5-0.1-1)/(-9-3/6*3)+5)+((3*3+2.5)/(-9-3/6*3))*3'# 对这串式子进行运算,不能使用运算模块
    if check_expreesion(formula):
        # print(formula)
        formula = format_str(formula)

        while formula.count('(') > 0:
            st = re.search('\([^()]*\)',formula).group()
            cal_nul = cal_nul_div(st)
            add_subs = add_sub(cal_nul)
            formula = format_str(formula.replace(st, add_subs[1:-1]))


            print(formula)
        else:
            replace_str = cal_nul_div(formula)
            # print(replace_str)
            replace_str = add_sub(replace_str)
            # print(replace_str)
            formula = formula.replace(formula, replace_str)
            print(formula.replace('+',''))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值