要求:禁止使用eval命令,让用户输入字符串,实现加减乘除加上括号的运算:
下面是自己写的代码:
# -*- coding:utf-8 -*-
import re
def jia_jian_cheng_chu(s):
m1_g = [ re.search('[+\-]?\d+\.?\d*[*/]\-?\d+\.?\d*', s).group() if re.search('[+\-]?\d+\.?\d*[*/]\-?\d+\.?\d*', s) else 0]
m2_g=[ re.search('[+\-]?\d+\.?\d*[+\-]\d+\.?\d*', s).group() if re.search('[+\-]?\d+\.?\d*[+\-]\d+\.?\d*', s) else 0]
if m1_g[0] !=0:
v = re.split('[*/]', m1_g[0])
result = [float(v[0]) * float(v[1]) if "*" in m1_g[0] else float(v[0]) / float(v[1])]
result = '+' + str(result[0])
s = s.replace(m1_g[0], result, 1).replace('+-', '-').replace('-+', '-').replace('--', '+').replace(
'++', '+')
return jia_jian_cheng_chu(s)
elif m2_g[0] !=0:
v=m2_g[0].replace('-','+-').lstrip('+').split('+')
result=float(v[0]) + float(v[1])
s=s.replace(m2_g[0],str(result),1).replace('+-', '-').replace('-+', '-').replace('--', '+').replace(
'++', '+')
return jia_jian_cheng_chu(s)
else:
return s
def bracket(bra):
bra=bra.replace(' ','')
ret=[jia_jian_cheng_chu(re.search('\([^()]*\)',bra).group().strip('()')) if re.search('\([^()]*\)',bra) else 0]
if ret[0] != 0:
bra=bra.replace(re.search('\([^()]*\)',bra).group(),ret[0],1)
bra=bra.replace('+-','-').replace('--','+').replace('--','+').replace('++','+')
return bracket(bra)
else:
ret=jia_jian_cheng_chu(bra)
return ret
def main():
while True:
expression = input('请输入您的表达式或者退出(b),只能含有数字,()和小数点以及加减乘除:').strip().replace(' ', '')
if expression.lower() == 'b': break
if re.search('[^0-9\.+\-*/()]', expression) or re.search('[+\-*/][+\-*/]', expression):
print('表达式错误')
else:
print('结果为: ')
print(bracket(expression))
if __name__ == '__main__':
main()
其实:一个运算可以切分为两类,有括号的和没有括号的
有括号的提取里面的东西,还要注意里面不能有括号,然后是乘除法优先级高于加减