練習 正規表示式計算器

2021-08-15 08:13:42 字數 2048 閱讀 4295

#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...