python正則練習 計算器

2021-08-18 11:05:57 字數 3540 閱讀 9120

1、實現加減乘除及拓號優先順序解析

2、使用者輸入帶有加減乘除小括號的複雜運算公式後,必須自己解析裡面的(),+,-,*,/符號和公式,運算後得出結果,結果必須與真實的計算器所得出的結果一致

# -*- coding:utf-8 -*-

import re

def check(string): #檢查是否有其他特殊字元字母,檢查表示式合法性

flag=true

if re.findall('[a-z]',string.lower()):

print('表示式錯誤,包含非法字元')

flag=false

if not string.count("(") == string.count(")"):

print("表示式錯誤,括號未閉合")

flag=false

return flag

def format_string(s): #格式化字串 :去掉空格

s=s.replace(' ','')

s=s.replace('--','+')

s=s.replace('++','+')

s=s.replace('+-','-')

s=s.replace('-+','-')

s=s.replace('*+','*')

s=s.replace('/+','/')

return s

def cal_mul_div(string): #計算乘除,如(30+6*2+9/3)

# ret1=re.search('\d+\.?\d*[*/]\d+\.?\d*',s) #匹配小數\d+\.?\d*,匹配乘或除[*/]

regular='\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'

while re.search(regular,string):

expression = re.search(regular,string).group() #獲取表示式6*2

if expression.count("*")==1: #如果是乘法

x,y = expression.split("*") #獲取要計算的2個數

mul_result = str(float(x) * float(y))

string = string.replace(expression,mul_result) #將計算的表示式替換為計算結果值

string = format_string(string) #格式化

if expression.count("/"): #如果是除法

x,y = expression.split("/")

div_result = str(float(x) / float(y))

string = string.replace(expression,div_result)

string = format_string(string)

if expression.count("*")==2: #如果是乘方

x,y=expression.split('**')

pow_result=1

for i in range(int(y)):

pow_result*=int(x)

string=string.replace(expression,str(pow_result))

string=format_string(string)

return string

def cal_add_sub(string): #計算加減

# ret1 = re.search('\d+\.?\d*[+-]\d+\.?\d*', s) # 匹配小數\d+\.?\d*,匹配加或減[+-]

add_regular='[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'

sub_regular='[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'

while re.findall(add_regular,string): #加法

add_list = re.findall(add_regular,string)

for add_str in add_list:

x,y = add_str.split("+")

add_result = "+" + str(float(x) + float(y))

string = string.replace(add_str, add_result)

string = format_string(string)

while re.findall(sub_regular,string): #減法

sub_list = re.findall(sub_regular,string)

for sub_str in sub_list:

numbers = sub_str.split("-")

if len(numbers) == 3:

result = 0

for v in numbers:

if v:

result -= float(v)

else:

x,y = numbers

result = float(x) - float(y)

return string

if __name__ == "__main__":

# source = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'

source = '1-2*3+9/3-(1+1+(2-1)*1)'

if check(source):

print("source:",source)

print("eval result:",eval(source))

source=format_string(source)

print(source)

# while re.search('\('):

while source.count('(') > 0:

strs=re.search('\([^()]+\)',source).group() #找到最裡面的()

repalce_str=cal_mul_div(strs) #將括號裡面的表示式進行乘除運算(2+15)

replace_str=cal_add_sub(repalce_str) #將括號裡面的表示式進行加減運算 '(17)'

source=format_string(source.replace(strs,repalce_str[1:-1])) #將括號的字串替換為計算結果,結果包含(),替換時去掉():[1:-1]

else: #沒有括號就到最後單一表示式了

strs = cal_mul_div(strs) # 算乘除

strs = cal_add_sub(strs) # 算加減

source = source.replace(source,replace_str)

print("my result:",source.replace("+",""))

Python 練習 計算器

import re def format string s 對表示式進行格式化 s s.replace s s.replace s s.replace s s.replace s s.replace s s.replace return s def check expression s 對表示式進行...

Python正則表達計算器

計算器 author ryoma time 17 39 import re def add string equ string flag true while flag is right re.search d d d d equ if is right old is right.group 計算加...

python正則實現計算器功能

coding utf 8 author gogh time 2017 12 4 20 16 email 361910002 qq.com import re def operator update formula 對formula公式進行 去除空字元,更新運算子處理 formula formula....