Python 作业

作业需求及初步思路

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. 
>>>').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("33[034mFormalization:33[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  

原文地址:https://www.cnblogs.com/lg100lg100/p/7774306.html