python 计算器 -- 正则练习

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys,logging,os
import re

计算: s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
# 1. 判断字符串的有效性:无字母、()个数能匹配上
# 2. 去除字符串中的空格
# 3. 处理最里面的括号
# 4. 处理乘法、除法
# 5. 处理加法、减法

def deal_sign(s):
s = s.replace('--', '+')
s = s.replace('++', '+')
s = s.replace('+-', '-')
return s

def multi_div(s): #(3*6+9)
while re.search('\d+\.?\d*[*/]\-?\d+\.?\d*', s):
s_temp = re.search('\d+\.?\d*[*/]\-?\d+\.?\d*', s).group()
if s_temp.count('*'):
x,y = re.split('\*',s_temp)
result = float(x) * float(y)
elif s_temp.count('/'):
x,y = re.split('\/',s_temp)
result = float(x) / float(y)
s = s.replace(s_temp, str(result))
return s

def plus_mines(s): # (1-9+1.2)
while re.search('\-?\d+\.?\d*[-+]\d+\.?\d*', s) :
s_temp = re.search('\-?\d+\.?\d*[-+]\d+\.?\d*', s).group()
if re.search('\d+\.?\d*\+', s_temp):
x,y = re.split('\+',s_temp)
result = float(x) + float(y)
elif re.search('\d+\.?\d*\-', s_temp):
if s_temp.startswith('-'):
x, y = re.split('\-', s_temp[1:])
result = - float(x) - float(y)
else:
x, y = re.split('\-', s_temp)
result = float(x) - float(y)
s = s.replace(s_temp, str(result))

return s

def count_reslut(source):
if len(re.findall('[a-zA-Z]',source)) == 0 and len(re.findall('\(', source)) == len(re.findall('\)', source)):
source_trim = source.replace(' ', '')
while re.findall('\(', source_trim):
# str1 = re.search('\([0-9\.\*\+/-]+\)',source_trim).group() ##
str1 = re.search('\([^()]+\)',source_trim).group() ##
source_temp = multi_div(str1)
source_temp = plus_mines(source_temp)
source_trim = source_trim.replace(str1, source_temp[1:-1])
source_trim = deal_sign(source_trim)
else:
source_temp = multi_div(source_trim)
source_temp = deal_sign(source_temp)
source_temp = plus_mines(source_temp)
source_trim = deal_sign(source_temp)
return source_trim

else:
print("您输入的字符串不合法!")


s = '1 + 32 + (3 + 9) * 5 + ( 1 +3-(3*6+9)*8 + 43 * 91 +9/3*(4+71))-10-(-1)'
print(count_reslut(s))
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(count_reslut(s))
s='(1.5+1)'
print(count_reslut(s))
posted @ 2018-09-11 15:14  拟好,妖妖灵  阅读(205)  评论(0编辑  收藏  举报