import re
def jisuan(x):
while True:
if '*' in x or '/' in x: #判断是否有乘法或者除法
muber1 = re.search('\\-?\\d*\\.*\\d+[*/]\\-?\\d*\\.*\\d+',x).group() #拿到第一个字符串,不知道是乘是除
if '*' in muber1: #乘法逻辑
numberla = re.split('\\*',muber1)
qian1 = numberla[0]
hou2 = numberla[1]
if '.' in qian1: #判断符号两边是否为小数
qian1_muber = float(numberla[0])
else:
qian1_muber = int(numberla[0])
if '.'in hou2:
hou2_muber = float(numberla[1])
else:
hou2_muber = int(numberla[1])
shuzi = qian1_muber*hou2_muber
x = x.replace(muber1,str(shuzi))
elif '/' in muber1: #除法运算逻辑
numberla = re.split('/',muber1)
qian1 = numberla[0]
hou2 = numberla[1]
if '.' in qian1: #判断符号两边是否为小数
qian1_muber = float(numberla[0])
else:
qian1_muber = int(numberla[0])
if '.'in hou2:
hou2_muber = float(numberla[1])
else:
hou2_muber = int(numberla[1])
shuzi = qian1_muber/hou2_muber
x =x.replace(muber1,str(shuzi)) #分的时候会出现小数而达不到取出完整的符号脸变得数
elif '+' in x or re.findall('\\d\\-\\w+',x) != []: #乘除法消完了
muber2 = re.search('\\-?\\d+\\.*\\d*[+\\-]\\-?\\d+\\.*\\d*',x).group() #加减法
if '+'in muber2:
numberla = re.split('\\+',muber2)
qian1 = numberla[0]
hou2 = numberla[1]
if '.' in qian1: #判断符号两边是否为小数
qian1_muber = float(numberla[0])
else:
qian1_muber = int(numberla[0])
if '.'in hou2:
hou2_muber = float(numberla[1])
else:
hou2_muber = int(numberla[1]) #加法运算逻辑
mubert = qian1_muber+hou2_muber
x = x.replace(muber2,str(mubert))
elif '-' in muber2: #减法运算逻辑
numberla = re.split('\\-',muber2)
qian1 = numberla[0]
hou2 = numberla[1]
if '.' in qian1: #判断符号两边是否为小数
qian1_muber = float(numberla[0])
else:
qian1_muber = int(numberla[0])
if '.'in hou2:
hou2_muber = float(numberla[1])
else:
hou2_muber = int(numberla[1])
mubert = qian1_muber-hou2_muber
x = x.replace(muber2,str(mubert))
else:
x = re.findall('\\-?\\d+\\.?\\d*',x)[0]
return(x)
def js(x):
x = re.sub(' ','',x)
if re.findall('[a-z]',x) != []:
print('请检查你输入计算器的字符,里面有字母无法计算')
elif re.findall('\\+\\++',x) != [] or re.findall('\\*\\*+',x) != [] or\
re.findall('--+',x) != [] or re.findall('//+',x) != []: #都是判断带入的字符串是否符合规范
print("请检查你的运算符是否输入有误")
elif len(re.findall('\\(',x)) != len(re.findall('\\)',x)):
print('请检查你括号是否写正确')
else: #没有括号直接调用逻辑函运算
if re.findall('[()]',x) == []:
myzhi = jisuan(x)
return myzhi
else:
while True: #有括号循环计算消除括号
muber1 = re.search('\\([^()]+\\)',x).group()
x =x.replace(muber1,jisuan(muber1))
if re.findall('[()]',x) == []: #消除所有括号,直接调用函数运算
myzhi = jisuan(x)
return(myzhi)
a = '3*5*(1+4)-10/4+((3.5+1)/5-1)'
print(js(a))
正则实现计算器
猜你喜欢
转载自www.cnblogs.com/huangjianfir/p/13402448.html
今日推荐
周排行