#coding:utf-8
import re
#正規表示式計算器
#檢測錯誤(1)括號匹配(2)運算子檢查 (3)非法字元
#查詢括號,乘除,加減。
#運算#主函式替換
# ret=re.findall('\([^()]+\)',s)
# 審核小括號
def check_k(s):
tag = 0
for x in s:
if x == '(':
tag += 1
elif x == ')':
tag -= 1
if tag < 0:
break
if tag == 0:
return 1
else:
raise exception('算式錯誤')
#運算子檢查
def check_f(s):
s=s.replace('++','+')
s=s.replace('--', '+')
s = s.replace('+-', '-')
s=s.replace('-+','+')
return s
def count(s_sub):
# 處理乘除,直到沒有乘除號,注意負號和小數點
ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub)
#直至內部無乘除運算後停止
while ret!=none:
num_1 = ret.group(1)
sign = ret.group(2)
num_2 = ret.group(3)
if sign == '*':
num = float(num_1) * float(num_2)
if sign == '/':
num = float(num_1) / float(num_2)
num = str(num)
s_sub = s_sub.replace(ret.group(), num)
ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub)
#處理加減,直至內部無加減運算後停止
ret=re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub)
while ret!=none:
num_1 = ret.group(1)
sign = ret.group(2)
num_2 = ret.group(3)
if sign == '+':
num = float(num_1)+float(num_2)
if sign == '-':
num = float(num_1)-float(num_2)
num = str(num)
s_sub = s_sub.replace(ret.group(), num)
ret = re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub)
return s_sub
s='1-2*((60-30+(-40/5)*(9-2*6/3+4*2998+10*568/2))-(-4*3)/(16-3*2))'
check_k(s)
#找到最內部括號
s_kuohao=re.findall('\([^()]+\)',s)
while s_kuohao!=: #能匹配到內部括號繼續迴圈
for x in s_kuohao:
#去括號
s_sub=x[1:-1]
#處理加減乘除,返回處理過的括號內容
tihuan=count(s_sub)
s=s.replace(x,tihuan)
#處理負號衝突
s=check_f(s)
s_kuohao=re.findall('\([^()]+\)',s)
s=count(s)
print(s)
計算器 (正規表示式
寫個計算器,輸入完全符合要求的 數字組成的表示式,計算相應結果。思路分先後順序遞迴拆解式子。先對 符合進行遞迴,直到全是 表示式,再對 表示式進行遞迴直到只有數字。最後返回計算。include using namespace std define maxn 100005 define maxm 10...
正規表示式作業 計算器
dic defadd info filename user info with open filename,r encoding utf 8 as f lines f.readlines last line lines 1 id max last line dic id ifid max.isdig...
正規表示式實現計算器
author 來童星 date 2019 11 10 import re source 1 2 60 30 40 5 9 2 5 3 7 3 99 4 2998 10 568 14 4 3 16 3 2 做檢查 def check s flag true if re.findall a za z s...