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

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

