码迷,mamicode.com
首页 > 编程语言 > 详细

python实现字符串计算器

时间:2017-07-08 11:22:32      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:res   去掉   else   get   bsp   strip   logs   class   enum   

  看兄弟连的Alex视频提到一题作业:计算字符串 "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"()不可以用eval)

我试了下,实现思路可能稍微有点复杂,不过代码不是很复杂,仅做参考。

import re

def get_parentheses(s):
	s = s.replace(‘ ‘,‘‘)  #空格去掉
	#print(s)
	#print("====================")
	while True:
		L = re.findall("\([+\-\*/\d\.]+\)", s)    #找到所有最内层的括号
		if L:
			for i in L:
				tmp = i.strip(‘()‘)
				result = get_multiplicative_division(tmp)
				s = s.replace(i,result)
				s = s.replace(‘+-‘,‘-‘)
				s = s.replace(‘--‘,‘+‘)	
			#	print(s)
			#	print("====================")
		else:
			s = get_multiplicative_division(s)
			break
	return s

"""
    get_multiplicative_division函数用来计算无括号的表达式,实现思路应该能理解
"""	
def get_multiplicative_division(s):
	num_list = re.findall(‘[\-]?[\d\.]+‘,s)
	sign_list = re.findall(‘[+\*/]‘,s)
	for i, s  in enumerate(num_list):
		if ‘-‘ in s and i >0 and len(sign_list)<len(num_list)-1:
			sign_list.insert(i - 1,‘+‘)
		
	for i, s in enumerate(sign_list):
		if s ==‘*‘ :
			num_list[i+1] = float(num_list[i]) * float(num_list[i+1])
			num_list[i] = 0
		elif s == ‘/‘:
			num_list[i+1] = float(num_list[i]) / float(num_list[i+1])
			num_list[i] = 0
		else:
			continue
	result = 0
	for i in num_list:
		result += float(i)
	return str(result)

		

if __name__ == ‘__main‘:
	s = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
	print(get_parentheses(s))

  

  其实,个人觉得实现方法很多,只是实现思路不同而已。

python实现字符串计算器

标签:res   去掉   else   get   bsp   strip   logs   class   enum   

原文地址:http://www.cnblogs.com/xjw-gjq/p/7135892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!