def atom_cal(exp):
if "*"in exp:
a, b = exp.split("*")
return str(float(a)*float(b))
elif "/" in exp:
a, b = exp.split("/")
return str(float(a)/float(b))
def mul_div(exp): # 先匹配乘除
while True:
ret = re.search("\d+[/*]-?\d+", exp)
if ret:
chengchu = ret.group() # 1*-22
res = atom_cal(chengchu)
exp = exp.replace(chengchu, res)
else:return exp
def func(exp):
exp = exp.replace("--","+")
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp
def add_sub(exp):
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)
s_um = 0
for i in ret:
s_um+=float(i)
return s_um
def main(exp):
exp = mul_div(exp)
exp = func(exp)
print(exp)
exp = add_sub(exp)
print(exp)
main('2-1*-22-3-4/-5')
import re
def atom_cal(exp):# 计算乘除的函数
if '*' in exp:
a,b = exp.split('*')
return str(float(a) * float(b))
elif '/' in exp:
a, b = exp.split('/')
return str(float(a) / float(b))
def format_exp(exp):
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp
def mul_div(exp):
while True:
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', exp) # 匹配括号里的乘除
if ret:#如果匹配到乘除的话
atom_exp = ret.group()#拿到匹配的结果
res = atom_cal(atom_exp)# 执行计算乘除的函数,并且拿到返回值
exp = exp.replace(atom_exp,res)#将拿到的计算结果替换以前得
else:return exp# 匹配完以后返回结果
def add_sub(exp):
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)# 匹配到有加减的内容,这里需要用取消分组操作
exp_sum = 0
for i in ret:
exp_sum += float(i)
return exp_sum
def cal(exp):
exp = mul_div(exp)# 执行乘除函数
exp = format_exp(exp)# 拿到计算 完乘除的结果,转换成小数
exp_sum = add_sub(exp)# 将计算完乘除的结果传递到匹配加减的函数中,并且拿到匹配的内容
return exp_sum # float
def main(exp):# 1
exp = exp.replace(' ','')# 2去除空格
while True:# 因为需要不断拿括号里的内容
ret = re.search('\([^()]+\)', exp)# 匹配到最内层括号
if ret :# 如果匹配到结果
inner_bracket = ret.group()#拿到匹配内容
res = str(cal(inner_bracket))#执行cal()函数 并且拿到计算加减的结果
exp = exp.replace(inner_bracket, res)# 然后将计算的结果替换掉匹配掉以前得结果
exp = format_exp(exp) # 处理加减号
else:break # 匹配不到就结束
return cal(exp)
s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
ret = main(s)
print(ret, type(ret))
随机红包
import random
def red_packet(money,nub):
money = money * 100
ret = random.sample(range(1, money), nub-1)
ret.sort()
ret.insert(0, 0)
ret.append(money)
print(ret)
for i in range(len(ret)-1):
yield (ret[i+1]-ret[i])/100
ret_g = red_packet(100,5)
print(ret_g)
for c in ret_g:
print(c)