python3 運用正則實現計算器

2022-09-14 00:54:12 字數 2924 閱讀 8794

import re

bracket = re.compile(r'\([^()]+\)') # 尋找最內層括號規則

mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 尋找乘法運算規則

div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 尋找除法運算規則

add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 尋找加法運算規則

sub = re.compile(r'(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)') # 尋找減法運算規則

c_f = re.compile(r'\([^*/]\)') # 檢查括號內是否運算完畢規則

strip = re.compile(r'[^(].*[^)]') # 脫括號規則

n_md = re.compile('\([^*/]+\)') # 乙個括號裡面沒有乘除 那麼只會有數字與加減

res = re.compile('([+-]?\d+\.?\d*)')

ills= re.compile(r'[^0-9*/+\-\(\)]')

def mul(exp):

result = re.split(r'\*',mul.search(exp).group())

return exp.replace(mul.search(exp).group(),str(float(result[0])*float(result[1])))

def div(exp):

result = re.split(r'/', div.search(exp).group())

return exp.replace(div.search(exp).group(), str(float(result[0])/ float(result[1])))

def add_sub(exp):

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

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

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

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

# print(exp)

nums = re.findall('[+\-]?\d+\.?\d*',exp)

count = 0

for num in nums:

count += float(num)

return str(count)

# 新增使用者輸入判斷

def calculator():

while true:

exp = input('>>>')

round_num = input('請輸入保留位數,輸入為空不保留:')

if exp.strip().upper() == 'q':

print('退出程式')

exit()

else:

try:

round_num = none if round_num.strip() == '' else int(round_num)

except exception as e:

print(e)

print('輸入非法,不保留小數字')

round_num =none

exp = exp.replace(' ','')

if ills.search(exp):

print('有非法字元!')

else:

while bracket.search(exp):

result = bracket.search(exp).group()

# print(result)

if div.search(result):

exp = exp.replace(result,div(result))

elif mul.search(result):

exp = exp.replace(result,mul(result))

elif n_md.search(result): # 將括號裡面的內容做加減運算,得到的結果然後替換整個括號

# exp = exp.replace(n_md.search(result).group(),add_sub(result))

exp = exp.replace(result, add_sub(result))

print(exp)

# 沒有括號了,操作整個表示式,先算乘除,再算加減

while true:

if div.search(exp):

result = div.search(exp).group()

exp = exp.replace(result,div(result))

elif mul.search(exp):

result = mul.search(exp).group()

exp = exp.replace(result,mul(result))

else:

result = add_sub(exp)

# print('the answer is: %.2f'%float(result))

print('the answer is: {}'.format(round(float(result),round_num)))

break

calculator()

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

# print(69*(69+1)*100+2*8)

Python3 正則匹配問題

python3通過re模組提供對正規表示式的支援。使用re的一般步驟是先將正規表示式的字串形式編譯為pattern例項,然後使用pattern例項處理文字並獲得匹配結果 乙個match例項 最後使用match例項獲得資訊,進行其他的操作。舉個例子 import re pattern re.compi...

python3實現CryptoJS AES加密演算法

from crypto.cipher import aes from binascii import b2a hex,a2b hex import base64 class aescrypt def init self,key self.key key.encode utf8 self.mode a...

Python3正則去掉HTML標籤

1.引用一段 import re html 目的是通過第一次soup.find按class粗略篩選並通過soup.find all篩選出列表中的a標籤並讀入href和title屬性 但是由於目標鏈結可能有鏈結,而這是我不想要的.請問如何去除?reg re.compile print reg.sub ...