最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用正則表達式實現(xiàn)計算器算法思路解析

 更新時間:2018年04月25日 17:33:26   作者:yimengtianya1  
這篇文章主要介紹了Python利用正則表達式實現(xiàn)計算器算法思路解析,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

 ?。?)不使用eval()等系統(tǒng)自帶的計算方法

 ?。?)實現(xiàn)四則混合運算、括號優(yōu)先級解析

思路:

  1、字符串預(yù)處理,將所有空格去除

  2、判斷是否存在括號運算,若存在進行第3步,若不存在則直接進入第4步

  3、利用正則表達式獲取最底層括號內(nèi)的四則運算表達式

  4、將四則運算表達式進行預(yù)處理:表達式開頭有負數(shù)時,在表達式前加上一個0

  5、利用re.split()、re.findall()方法,通過加減符號,對四則運算進行拆分為乘除運算式和數(shù)字,并保留對應(yīng)的位置下標(biāo)。

  6、利用re.split()、re.findall()方法,通過乘除符號,將乘除式拆分為乘除符號與數(shù)字,然后進行計算,并返回數(shù)值。

  7、通過re.split()、re.findall()保留的下標(biāo)位置,將表達式還原。

  8、完成所有乘除運算之后,返回進行加減運算。

  9、完成加減運算后,返回表達式進行替代。

  10、通過遞歸函數(shù),完成所有括號運算后。最后再完成一次四則運算即可完成所有運算。

  注:在過程中,負數(shù)的處理存在三個要點:當(dāng)負數(shù)出現(xiàn)在表達式開頭、負數(shù)前面存在減法、乘除式中存在負數(shù)且不在表達式開頭。

 ?。?)當(dāng)負數(shù)出現(xiàn)在表達式開頭:在前面加上一個0

 ?。?)負數(shù)前面存在減法:每次完成一次運算后需要進行一次符號檢查替換

 ?。?)乘除式中存在負數(shù)且不在表達式開頭:將負號移到表達式最開頭

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Dang
import re
def update_formula(calc_list,calc_operator_list):
  # 通過拆分后的表達式列表與符號列表重新組合
  for index,item in enumerate(calc_list):
    if index == 0:
      formula = item
    elif index != 0:
      formula += calc_operator_list[index-1] + item
  return formula
def negative_start_issue(formula):
  #處理負數(shù)在括號內(nèi)表達式開頭的情形
  calc_list = re.split("[+-]",formula)  #通過+-符號將各個乘除運算分隔出來
  calc_operator_list = re.findall("[+-]",formula)
  for index,item in enumerate(calc_list):
    if index == 0 and item == '':  # 處理負號在開頭的問題
      calc_list[index] = '0'
    else:
      calc_list[index] = item.strip()
  formula = update_formula(calc_list,calc_operator_list)
  return formula
def deal_unusual_issue(formula):
  # 雙加減符號處理
  formula = formula.replace(" ","") #去掉空格
  formula = formula.replace("++","+")
  formula = formula.replace("+-", "-")
  formula = formula.replace("-+", "-")
  formula = formula.replace("--", "+")
  return formula
def deal_negative_issue(formula):
  # 處理乘除運算中負數(shù)的計算問題(分前后位置兩種情況)
  # 1.負數(shù)在后
  m = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula)
 # minus_pre = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula).group()
  # 注意匹配的必要項與非必要項,如:"[0-9]+[.][0-9]+[*|/][-][0-9]+[.][0-9]+"誤把非必要項當(dāng)做必要項。
  if m:
    minus_pre = m.group()
    minus_pro = "-"+minus_pre.replace("-","")
    formula = formula.replace(minus_pre,minus_pro)
  if "*-" in formula or "/-" in formula:
    return deal_negative_issue(formula)
  # 2.負數(shù)在前
  formula = deal_unusual_issue(formula)
  return formula
def multiply_divide(formula):
  # print("[%s]"%formula,formula)
  # 乘除計算
  calc_list = re.split("[*/]", formula)
  operator_list = re.findall("[*/]", formula) # 將乘號除號通過列表方式分隔出來
  # print("sub_calc_list:", sub_calc_list)
  # print("sub_operator_list:", sub_operator_list)
  res = 0
  for index2, i in enumerate(calc_list):
    if index2 == 0:
      res = float(i)
    else:
      if operator_list[index2 - 1] == '*': # 通過sub_operator_list中的index判斷到底是加法還是減法,
        res *= float(i)
      elif operator_list[index2 - 1] == '/':
        res /= float(i)
  return res
def add_abstract(formula):
  # 加減計算
  # 1.開頭位置負數(shù)處理
  formula = negative_start_issue(formula)
  # 2.雙加減符號處理
  formula = deal_unusual_issue(formula)
  # 3.加減邏輯運算
  calc_list = re.split("[+-]", formula)
  operator_list = re.findall("[+-]", formula)
  res = 0
  for index, i in enumerate(calc_list):
    if index == 0:
      res = float(i)
    else:
      if operator_list[index-1] == '+':
        res += float(i)
      elif operator_list[index-1] == '-':
        res -= float(i)
  return res
"""

四則混合運算主函數(shù)

"""def elementary_arithmetic(formula):
  # 負數(shù)處理
  formula = negative_start_issue(formula)
  formula = deal_negative_issue(formula)
  # 乘除運算
  calc_list = re.split("[+-]",formula)  # 通過+-符號將各個乘除運算分隔出來
  calc_operator_list = re.findall("[+-]",formula)
  for index1, item in enumerate(calc_list):
    calc_list[index1] = str(multiply_divide(item)) #數(shù)據(jù)類型的強制轉(zhuǎn)換?。。?
  formula = update_formula(calc_list,calc_operator_list)
  # 加減運算
  formula = add_abstract(formula)
  return formula
"""
括號運算
"""
def calculator(formula):
  #數(shù)據(jù)預(yù)處理
  formula = formula.replace(" ","")
  m = re.search("\([^()]*\)",formula)
  # 判斷是否需要進行括號運算
  if m:
    # 括號運算
    # 提取最小括號運算式,計算結(jié)果,并返回。
    subformula = m.group().strip("()") # 把找出來的括號剝離
    print("subformula:",subformula,type(subformula))
    subres = elementary_arithmetic(subformula) # 調(diào)用四則混合運算主函數(shù)
    print("subres:",subres)
    formula = formula.replace(m.group(), str(subres))
    print("updated formula:",formula)
    if "(" in formula:
      return calculator(formula)
    else:
      print("formula result:",formula)
    # 除去所有括號后可能出現(xiàn):1-2*-312.8
    formula = elementary_arithmetic(formula)
    return formula
  else:
    return elementary_arithmetic(formula)
# 以下為測試代碼:
formula = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*9/4*28 +10 * 56/14 )) - (-4*3)/ (16-3*2) )"
print("%s = "%formula,calculator(formula))

總結(jié)

以上所述是小編給大家介紹的Python利用正則表達式實現(xiàn)計算器算法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • pandas去重復(fù)行并分類匯總的實現(xiàn)方法

    pandas去重復(fù)行并分類匯總的實現(xiàn)方法

    這篇文章主要介紹了pandas去重復(fù)行并分類匯總的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Python正規(guī)則表達式學(xué)習(xí)指南

    Python正規(guī)則表達式學(xué)習(xí)指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎(chǔ)以及Python正則表達式標(biāo)準(zhǔn)庫的完整介紹及使用示例,非常不錯,具有參考借鑒價值,需要的朋友一起學(xué)習(xí)吧
    2016-08-08
  • Python運算符的應(yīng)用超全面詳細教程

    Python運算符的應(yīng)用超全面詳細教程

    Python運算符是為了實現(xiàn)數(shù)值或字符運算的特殊符號。Python運算符可以分為算術(shù)運算符、邏輯運算符、賦值運算符、成員運算符、身份運算符、比較運算符、三目運算符等。接下來,我們就開始來學(xué)習(xí)這一堆符號吧
    2022-07-07
  • 教你用Python尋找重復(fù)文件并刪除的腳本寫法

    教你用Python尋找重復(fù)文件并刪除的腳本寫法

    這篇文章主要介紹了如何用Python尋找重復(fù)文件并刪除,該腳本主要包括diskwalk,chechsum,find_dupes,delete模塊,其中diskwalk模塊是遍歷文件的,給定路徑,遍歷輸出該路徑下的所有文件,需要的朋友可以參考下
    2022-01-01
  • 利用Python批量導(dǎo)出mysql數(shù)據(jù)庫表結(jié)構(gòu)的操作實例

    利用Python批量導(dǎo)出mysql數(shù)據(jù)庫表結(jié)構(gòu)的操作實例

    這篇文章主要給大家介紹了關(guān)于利用Python批量導(dǎo)出mysql數(shù)據(jù)庫表結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • python+Django實現(xiàn)防止SQL注入的辦法

    python+Django實現(xiàn)防止SQL注入的辦法

    這篇文章主要介紹了python+Django實現(xiàn)防止SQL注入的辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python實現(xiàn)TCP通信的示例代碼

    Python實現(xiàn)TCP通信的示例代碼

    這篇文章主要介紹了Python實現(xiàn)TCP通信的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • matplotlib圖例legend語法及設(shè)置的方法

    matplotlib圖例legend語法及設(shè)置的方法

    這篇文章主要介紹了matplotlib圖例legend語法及設(shè)置的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python判斷是空的實例分享

    python判斷是空的實例分享

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python怎么判斷是空的相關(guān)知識點內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2020-07-07
  • 定位python內(nèi)存泄漏問題及解決

    定位python內(nèi)存泄漏問題及解決

    這篇文章主要介紹了定位python內(nèi)存泄漏問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

定襄县| 西藏| 商城县| 永宁县| 镇巴县| 蓬溪县| 同心县| 鄂托克前旗| 康马县| 甘孜县| 富宁县| 东丰县| 昆山市| 襄樊市| 峨眉山市| 多伦县| 运城市| 青海省| 永顺县| 阳谷县| 怀来县| 沽源县| 迁安市| 炉霍县| 富蕴县| 沙湾县| 富锦市| 天等县| 嘉鱼县| 高尔夫| 寿光市| 周口市| 三门峡市| 湖南省| 社会| 吉水县| 承德市| 通州市| 清镇市| 巴中市| 娱乐|