用正则表达式实现简单计算器

#1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
import re
def check_text(str): #处理连续运算符
str = str.replace("++","+")
str = str.replace("-+","-")
str = str.replace("+-","-")
str = str.replace("--","+")
return str

def mul_div(text): #处理乘除法
while re.findall(r'[*/]',text):
textNew = re.search(r'\d+\.?\d*[*/](-)?\d+\.?\d*',text).group(0)
if re.findall(r'\*',textNew):
textList = textNew.split('*')
result = float(textList[0]) * float(textList[1])
text = text.replace(textNew,str(result))
else:
textList = textNew.split('/')
result = float(textList[0]) / float(textList[1])
text = text.replace(textNew,str(result))
return text

def add_sub(text): #处理加减法
while re.findall(r'(-)?\d+\.?\d*[+-](-)?\d+\.?\d*',text):
textNew = re.search(r'(-)?\d+\.?\d*[+-](-)?\d+\.?\d*',text).group(0)
if re.findall(r'\+',textNew):
textList = textNew.split('+')
result = float(textList[0]) + float(textList[1])
text = text.replace(textNew,str(result))
else:
textList = textNew.split('-')
result = float(textList[0]) - float(textList[1])
text = text.replace(textNew,str(result))
return text

def deal_paren(str): #处理最里面的括号
while True:
if re.search(r'\(([^()])+\)',str):
lessParen = re.search(r'\(([^()])+\)',str)
if lessParen:
lessParen = lessParen.group(0)
if re.findall(r'[*/]',lessParen):
str1 = mul_div(lessParen)
str1 = str1[1:-1]
if re.findall(r'(\(-)?\d+\.?\d*[+-]\d+\.?\d*',str1):
str2 = add_sub(str1)
str = re.sub(r'\(([^()])+\)', str2, str,1)
else:
str = re.sub(r'\(([^()])+\)', str1, str,1)
str = check_text(str)
else:
strNmd = mul_div(str)
strNmd = check_text(strNmd)
strNas = add_sub(strNmd)
print(strNas)
break
return str

def main(): #函数入口
str = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
str = str.replace(" ","")
str_no_paren = deal_paren(str)


main()

转载于:https://www.cnblogs.com/wangliang666/p/9417910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值