标签:nbsp 正则 param val ace 运算 put str class
使用正则表达式
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))
标签:nbsp 正则 param val ace 运算 put str class
原文地址:https://www.cnblogs.com/xingkongyihao/p/8759019.html