Python 练习: 计算器

import re

def format_string(s):             # 对表达式进行格式化
    s = s.replace(' ', '')
    s = s.replace("--", "+")
    s = s.replace("++", "+")
    s = s.replace("+-", "-")
    s = s.replace("*+", "*")
    s = s.replace("/+", "/")
    return s


def check_expression(s):          # 对表达式进行检测
    flag = True
    if not s.count("(") == s.count(")"):
        print("括号没有闭合")
        flag = False
    if re.findall('[a-z]+', s.lower()):
        print("有非法字符")
        flag = False

    return flag


def calc_mul_div(s):
    regular = '[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*'

    while re.findall(regular, s):
        expression = re.search(regular, s).group()

        if expression.count("*"):          # 判断是否是乘法
            x, y = expression.split("*")
            mul_result = str(float(x) * float(y))
            s = s.replace(expression, mul_result)
            s = format_string(s)

        if expression.count("/"):          # 判断是否是除法
            x, y = expression.split('/')
            div_result = str(float(x) / float(y))
            s = s.replace(expression, div_result)
            s = format_string(s)

    return s


def calc_add_sub(s):                       # 判断加减法
    add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
    sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'

    while re.findall(add_regular, s):
        add_list = re.findall(add_regular, s)
        for add_str in add_list:
            x, y = add_str.split("+")
            add_result = "+" + str(float(x) + float(y))
            s = s.replace(add_str, add_result)
        s = format_string(s)

    while re.findall(sub_regular, s):
        sub_list = re.findall(sub_regular, s)
        for sub_str in sub_list:
            numbers = sub_str.split("-")
            if len(numbers) == 3:      # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
                                       # 如果表达式类似 8-2, 则 list 是 ['8', '2']
                result = 0
                for v in numbers:
                    if v:
                        result -= float(v)
            else:
                x, y = numbers
                result = float(x) - float(y)
            s = s.replace(sub_str, "+" + str(result))
        s = format_string(s)

    return s


if __name__ == "__main__":
    s = '(( 2 /1 * 7 ) - ( 3 *4 ) )'

    if check_expression(s):
        s = format_string(s)

        while s.count("(") > 0:
            strs = re.search('\([^()]*\)', s).group()
            replace_str = calc_mul_div(strs)

            replace_str = calc_add_sub(replace_str)

            s = format_string(s.replace(strs, replace_str[1:-1]))  # 去掉多余的括号

        else:
            replace_str = calc_mul_div(s)

            replace_str = calc_add_sub(replace_str)

            s = s.replace(s, replace_str)

        print("result: ", s.replace("+", ""))


运行结果:
result:  2.0
posted @ 2018-04-27 11:35  klvchen  阅读(318)  评论(0编辑  收藏  举报