作业需求及初步思路
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("