Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能
需求:
用戶輸入運(yùn)算表達(dá)式,終端顯示計(jì)算結(jié)果
代碼:
# !/usr/bin/env/ python3
# -*- coding: utf-8 -*-
"""用戶輸入計(jì)算表達(dá)式,顯示計(jì)算結(jié)果"""
__author__ = 'Jack'
import re
bracket = re.compile(r'\([^()]+\)') # 尋找最內(nèi)層括號(hào)規(guī)則
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 尋找乘法運(yùn)算規(guī)則
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 尋找除法運(yùn)算規(guī)則
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 尋找加法運(yùn)算規(guī)則
sub = re.compile(r'(\d+\.?\d*--\d+\.?\d*)|(\d+\.?\d*-\d+\.?\d*)') # 尋找減法運(yùn)算規(guī)則
c_f = re.compile(r'\(?\+?-?\d+\)?') # 檢查括號(hào)內(nèi)是否運(yùn)算完畢規(guī)則
strip = re.compile(r'[^(].*[^)]') # 脫括號(hào)規(guī)則
def Mul(s):
"""計(jì)算表達(dá)式中的乘法運(yùn)算"""
exp = re.split(r'\*', mul.search(s).group())
return s.replace(mul.search(s).group(), str(float(exp[0]) * float(exp[1])))
def Div(s):
"""計(jì)算表達(dá)式中的除法運(yùn)算"""
exp = re.split(r'/', div.search(s).group())
return s.replace(div.search(s).group(), str(float(exp[0]) / float(exp[1])))
def Add(s):
"""計(jì)算表達(dá)式中的加法運(yùn)算"""
exp = re.split(r'\+', add.search(s).group())
return s.replace(add.search(s).group(), str(float(exp[0]) + float(exp[1])))
def Sub(s):
"""計(jì)算表達(dá)式中的減法運(yùn)算"""
exp = re.split(r'-', sub.search(s).group())
return s.replace(sub.search(s).group(), str(float(exp[0]) - float(exp[1])))
def calc():
while True:
s = input('Please input the expression(q for quit):') # 例:'1+2- (3* 4-3/2+ ( 3-2*(3+ 5 -3* -0.2-3.3*2.2 -8.5/ 2.4 )+10) +10)'
if s == 'q':
break
else:
s = ''.join([x for x in re.split('\s+', s)]) # 將表達(dá)式按空格分割并重組
if not s.startswith('('): # 若用戶輸入的表達(dá)式首尾無括號(hào),則統(tǒng)一格式化為:(表達(dá)式)
s = str('(%s)' % s)
while bracket.search(s): # 若表達(dá)式s存在括號(hào)
s = s.replace('--', '+') # 檢查表達(dá)式,并將--運(yùn)算替換為+運(yùn)算
s_search = bracket.search(s).group() # 將最內(nèi)層括號(hào)及其內(nèi)容賦給變量s_search
if div.search(s_search): # 若除法運(yùn)算存在(必須放在乘法之前)
s = s.replace(s_search, Div(s_search)) # 執(zhí)行除法運(yùn)算并將結(jié)果替換原表達(dá)式
elif mul.search(s_search): # 若乘法運(yùn)算存在
s = s.replace(s_search, Mul(s_search)) # 執(zhí)行乘法運(yùn)算并將結(jié)果替換原表達(dá)式
elif sub.search(s_search): # 若減法運(yùn)算存在(必須放在加法之前)
s = s.replace(s_search, Sub(s_search)) # 執(zhí)行減法運(yùn)算并將結(jié)果替換原表達(dá)式
elif add.search(s_search): # 若加法運(yùn)算存在
s = s.replace(s_search, Add(s_search)) # 執(zhí)行加法運(yùn)算并將結(jié)果替換原表達(dá)式
elif c_f.search(s_search): # 若括號(hào)內(nèi)無任何運(yùn)算(類似(-2.32)除外)
s = s.replace(s_search, strip.search(s_search).group()) # 將括號(hào)脫掉,例:(-2.32)---> -2.32
print('The answer is: %.2f' % (float(s)))
if __name__ == '__main__':
calc()
運(yùn)行效果:

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)
這篇文章主要介紹了Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼
這篇文章主要介紹了純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Python實(shí)現(xiàn)帶圖形界面的炸金花游戲(升級(jí)版)
詐金花又叫三張牌,是在全國(guó)廣泛流傳的一種民間多人紙牌游戲,它具有獨(dú)特的比牌規(guī)則。本文將通過Python語言實(shí)現(xiàn)升級(jí)版的帶圖形界面的詐金花游戲,需要的可以參考一下2022-12-12
基于Pygame中Pygame模塊的大戰(zhàn)外星人實(shí)戰(zhàn)
本文主要介紹了基于Pygame中Pygame模塊的大戰(zhàn)外星人實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
python threading和multiprocessing模塊基本用法實(shí)例分析
這篇文章主要介紹了python threading和multiprocessing模塊基本用法,結(jié)合實(shí)例形式詳細(xì)分析了Python中threading和multiprocessing模塊基本概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-07-07
python實(shí)現(xiàn)0到1之間的隨機(jī)數(shù)方式
這篇文章主要介紹了python實(shí)現(xiàn)0到1之間的隨機(jī)數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
詳解用python實(shí)現(xiàn)基本的學(xué)生管理系統(tǒng)(文件存儲(chǔ)版)(python3)
這篇文章主要介紹了python實(shí)現(xiàn)基本的學(xué)生管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

