计算器——python正则表达式
Posted starry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算器——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、搜索出最里层的() 比如上面这个表达式第一个是(-40/5)
2、然后把()去掉,开始计算,先计算* /
3、最后计算 + - ,然后把计算的结果 - 8.0 代替之前的(-40/5)
具体代码如下:
#-*- coding:utf-8 -*- ‘‘‘ @auther: Starry @file: work.py @time: 2018/4/8 20:32 ‘‘‘ import re ‘‘‘ 开发一个简单的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等类似功能偷懒实现),运算后得出结果, 结果必须与真实的计算器所得出的结果一致 ‘‘‘ def mulAndDiv(s): ‘‘‘ 没有括号,但有+ - * / 的表达式,只计算* / 运算符 :param s: 有* 、/ 、+ 或 - 的表达式 :return: 计算的结果 ‘‘‘ while re.search(r‘[\*/]‘,s): ss = re.search(r‘[\d\.]+[\*/]-?[\d\.]+‘,s).group() if ‘*‘ in ss: result = str(float(ss[:ss.index(‘*‘)])*float(ss[ss.index(‘*‘)+1:])) else: result = str(float(ss[:ss.index(‘/‘)])/float(ss[ss.index(‘/‘)+1:])) s = s.replace(ss, result) return s def addAndSub(s): ‘‘‘ 计算只有+ - 的表达式 有可能出现 ‘--‘,这就要将其两个都装换成+ :param s: 只有+ - 的表达式 :return: 计算的结果 ‘‘‘ array = re.findall(r‘([\d\.]+|-|\+)‘, s) for i in range(len(array)-1): if array[i] == ‘-‘ and array[i+1] == ‘-‘: array[i] = array[i+1] = ‘+‘ for i in range(len(array)): if array[i] == ‘-‘: array[i] = ‘+‘ array[i+1] = str(float(array[i+1])*-1) sum = 0.0; for a in array: if a != ‘+‘: sum += float(a) return str(sum) def calculator(s): ‘‘‘ 计算最里层的(),将结果替代之前的值。 :param s: 要计算的表达式 :return: 计算的答案 ‘‘‘ while ‘(‘ in s: ss = re.search(r‘\([^()]+\)‘,s).group() sss = addAndSub(mulAndDiv(ss[1:-1])) s = s.replace(ss,sss) return addAndSub(mulAndDiv(s)); if __name__ == ‘__main__‘: ss = input().replace(‘ ‘,‘‘) # ss = ‘1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )‘.replace(‘ ‘,‘‘) try: print(calculator(ss)) except: print("表达有错!") print(eval(ss))
以上是关于计算器——python正则表达式的主要内容,如果未能解决你的问题,请参考以下文章