国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python利用正則表達式實現計算器算法思路解析

Python利用正則表達式實現計算器算法思路解析

2021-02-05 00:36yimengtianya1 Python

這篇文章主要介紹了Python利用正則表達式實現計算器算法思路解析,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

  (1)不使用eval()等系統自帶的計算方法

 ?。?)實現四則混合運算、括號優先級解析

思路:

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

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

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

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

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

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

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

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

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

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

  注:在過程中,負數的處理存在三個要點:當負數出現在表達式開頭、負數前面存在減法、乘除式中存在負數且不在表達式開頭。

 ?。?)當負數出現在表達式開頭:在前面加上一個0

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/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):
  #處理負數在括號內表達式開頭的情形
  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):
  # 處理乘除運算中負數的計算問題(分前后位置兩種情況)
  # 1.負數在后
  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]+"誤把非必要項當做必要項。
  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.負數在前
  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.開頭位置負數處理
  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
"""

四則混合運算主函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
"""def elementary_arithmetic(formula):
  # 負數處理
  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)) #數據類型的強制轉換?。?!
  formula = update_formula(calc_list,calc_operator_list)
  # 加減運算
  formula = add_abstract(formula)
  return formula
"""
括號運算
"""
def calculator(formula):
  #數據預處理
  formula = formula.replace(" ","")
  m = re.search("\([^()]*\)",formula)
  # 判斷是否需要進行括號運算
  if m:
    # 括號運算
    # 提取最小括號運算式,計算結果,并返回。
    subformula = m.group().strip("()") # 把找出來的括號剝離
    print("subformula:",subformula,type(subformula))
    subres = elementary_arithmetic(subformula) # 調用四則混合運算主函數
    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)
    # 除去所有括號后可能出現: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))

總結

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

原文鏈接:https://www.cnblogs.com/yimengtianya1/archive/2018/04/25/8945762.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 免费午夜电影 | 久久丁香视频 | www.亚洲精品| 欧美日韩综合视频 | 精品久久久久久久久久久下田 | 中文字幕视频在线 | 91精品久久久久久久久久 | 日韩在线免费视频 | 久久久久久一区 | 久久se精品一区精品二区 | 色就是色网站 | 久久精品一区二区三区四区 | 黄视频免费观看 | 国产日韩一区 | av片免费看 | 午夜视频国产 | 一区二区在线视频 | 亚洲精品综合 | 亚洲 欧美 日韩 丝袜 另类 | 中文字幕一区二区三区不卡 | 91视频入口 | 欧美综合区 | 日韩在线观看一区 | 亚洲视频1区 | 精品小视频 | 欧美福利电影在线观看 | 免费成人在线观看视频 | 日本一区二区三区精品视频在线观看 | 久久久久久成人 | 在线观看黄免费 | 欧美一区二区免费在线 | 免费观看一级一片 | 91cn在线观看 | 日韩经典一区 | 国产亚洲欧美另类一区二区三区 | 亚洲一区二区三区在线播放 | 亚洲网视频 | a国产在线 | 国产二区视频 | 久久青青| 欧美精品系列 |