作业需求及初步思路

1. 实现加减乘除及拓号优先级解析

2. 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

知识点

1. 基础re pattern: 浮点数的表示等

2. 关键是()内计算,再除乘,再加减

My work

#!usr/bin/env python 3
# -*- coding:utf-8 -*-
__author__ = "Jane"

import re, sys

parenthesis = re.compile(r'\([^()]+\)')
multiply = re.compile(r'(\d+(\.\d*)?\*-\d+(\.\d*)?)|(\d+(\.\d*)?\*\d+(\.\d*)?)')   # 浮点数的正则模式
divide = re.compile(r'(\d+(\.\d*)?/\d+(\.\d*)?)|(\d+(\.\d*)?/-\d+(\.\d*)?)')
plus = re.compile(r'-?\d+(\.\d*)?\+-?\d+(\.\d*)?')
subtract = re.compile(r'-?\d+(\.\d*)?--?\d+(\.\d*)?')
calc_check = re.compile(r'\(?\+?-?\d+(\.\d*)?\)?')   # 检验括号中的运算是否结束
par_strip = re.compile(r'[^(].*[^)]')    # 脱括号,取括号里的值


def mul(x):
    calc_exp = multiply.search(x).group()
    calc_list = re.split(r'\*', calc_exp)
    calc_res = str(float(calc_list[0]) * float(calc_list[1]))
    return calc_res


def div(x):
    calc_exp = divide.search(x).group()
    calc_list = re.split(r'/', calc_exp)
    calc_res = str(float(calc_list[0]) / float(calc_list[1]))
    return calc_res


def add(x):
    calc_exp = plus.search(x).group()
    calc_list = re.split(r'\+', calc_exp)
    calc_res = str(float(calc_list[0]) + float(calc_list[1]))
    return calc_res


def minus(x):
    calc_exp = subtract.search(x).group()
    calc_list = re.split(r'-', calc_exp)
    calc_res = str(float(calc_list[0]) - float(calc_list[1]))
    return calc_res


def calculator():
    while True:
        exp = input('Please input your expression. [q] for quit. \n>>>').strip()
        if exp == "q":
            sys.exit('Thank you for using the calculator')
        elif re.search(r'[A-Za-z]+',exp):
            print('INPUT ERROR: The expression contains letter/s. Please try again.')
            continue
        else:
            exp = ''.join([x for x in re.split(r"\s+", exp)])
            if not exp.startswith('(') and exp.endswith(')'):  # 将整个公式带上括号,进入循环
                exp = str('(%s)' % exp)
                print("\033[034mFormalization:\033[0m", exp)
                while parenthesis.search(exp):
                    exp = exp.replace("--", "+")
                    search_res = parenthesis.search(exp).group()   # 当前公式最内层括号内的字符串
                    if divide.search(search_res):
                        exp = exp.replace(divide.search(search_res).group(), div(search_res))
                        print(exp)
                    elif multiply.search(search_res):
                        exp = exp.replace(multiply.search(search_res).group(), mul(search_res))
                        print(exp)
                    elif subtract.search(search_res):
                        exp = exp.replace(subtract.search(search_res).group(), minus(search_res))
                        print(exp)
                    elif plus.search(search_res):
                        exp = exp.replace(plus.search(search_res).group(), add(search_res))
                        print(exp)
                    elif calc_check.search(search_res):
                        exp = exp.replace(search_res, par_strip.search(search_res).group())
                        print(exp)

                print('The answer is: %s' % (exp))


if __name__ == "__main__":
    calculator()
calc

 

SAMPLES

sample 1

sample 2  

 

posted on 2017-11-02 20:50  lg100_lg100  阅读(277)  评论(0编辑  收藏  举报