python正则实现计算器功能
作者:THE_Gogh 发布时间:2022-06-13 06:14:00
标签:python,正则,计算器
本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下
# -*- coding: utf-8 -*-
# Author :Gogh
# @Time :2017/12/4 20:16
# @Email :361910002@qq.com
import re
def operator_update(formula):
# 对formula公式进行 去除空字符,更新运算符处理
formula = formula.replace(" ", "") # 去除空字符
formula = formula.replace("+-", "-")
formula = formula.replace("--", "+")
return formula
def calc_muldiv(formula_list):
'''''
计算公式里面的乘除
:param formula: 列表
:return:
'''
for index, element in enumerate(formula_list):
if "*" in element or "/" in element:
operators = re.findall("[*/]", element)
calc_list = re.split("[*/]", element)
num = None
for i, e in enumerate(calc_list):
if num:
if operators[i - 1] == "*":
num *= float(e)
elif operators[i - 1] == "/":
num /= float(e)
else:
num = float(e)
formula_list[index] = num
return formula_list
def calc_plumin(operators, num_list):
'''''
计算列表数字的加减
:param operators: 运算符列表
:param num_list: 进行运算的数字列表
:return: 返回计算结果
'''
num = None
for i, e in enumerate(num_list):
if num:
if operators[i - 1] == "+":
num += float(e)
elif operators[i - 1] == "-":
num -= float(e)
else:
num = float(e)
return num
def merge(plus_minus_operator, multiply_divide_list):
'''''
把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块
:param formula_list:
:return:
'''
for index, element in enumerate(multiply_divide_list):
if element.endswith("*") or element.endswith("/"):
multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1]
del multiply_divide_list[index + 1]
del plus_minus_operator[index]
return merge(plus_minus_operator, multiply_divide_list)
return plus_minus_operator, multiply_divide_list
def bracket_calc(formula):
'''''
对括号最内层的formula公式进行计算
:param formula:
:return:
'''
formula = re.sub("[()]", "", formula) # 去除两边的()
formula = operator_update(formula)
plus_minus_operator = re.findall("[+-]", formula) # 列表 '+' '-' 运算符
multiply_divide_list = re.split("[+-]", formula) # 列表 有'*' '/'
if multiply_divide_list[0] == "": # multiply_divide_list列表第一个字符为空的话,表示一个数字为负号
multiply_divide_list[1] = "-" + multiply_divide_list[1]
del plus_minus_operator[0]
del multiply_divide_list[0]
res = merge(plus_minus_operator, multiply_divide_list)
plus_minus_operator = res[0] # 列表 '+' '-' 运算符 进行合并处理
multiply_divide_list = res[1]
plus_minus_list = calc_muldiv(multiply_divide_list) # 生成只进行加减运算的列表
res = calc_plumin(plus_minus_operator, plus_minus_list)
return res
def calculate(formula):
'''''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
while True:
formula_depth = re.search("[()]+", formula)
if formula_depth:
formula_depth = formula_depth.group()
res = bracket_calc(formula_depth)
formula = formula.replace(formula_depth, str(res))
print("\33[34;1m%s\33[0m" % (formula))
else:
res = bracket_calc(formula)
print("\33[31;1m结果:%s\33[0m" % (res))
exit()
if __name__ == '__main__':
formula = "1 - 2 * ( (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"
calculate(formula)
来源:http://blog.csdn.net/Goghdian/article/details/78791468


猜你喜欢
- 假设有2个有序列表l1、l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序。思路是比较简单的,无非是依次比较l1和l
- 本文实例讲述了python概率计算器实现方法。分享给大家供大家参考。具体实现方法如下:from random import randrang
- 本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法。分享给大家供大家参考,具体如下:根据 * 的伪代码实现:广度优先
- Python时间格式化的时候,去掉前导0的:dt = datetime.now() print dt.strftime('%-H
- 在当前的Web设计中,jQuery被越来越多地应用在Web开发中,之所以jQuery收到如此程度的欢迎,除了其本身具备的优秀易读易操作的代码
- 目录用Python实现定时任务用Python实现定时任务的四种方法利用while True: + sleep()实现定时任务利用thread
- 列表和元组,都是一个可以放置任何数据类型的有序集合。 列表的特性动态的(mutable):长度大小不固定,可以随意地增加、删减或者改变元素。
- MySQL中SQL Mode的查看与设置MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql
- 验证关键词是否为sql保留字的在线工具:<html> <head><t
- 加密与解密原理的一个例子 package lockunlock; import Java.awt.*;&nb
- 随着互联网产业的飞速发展和电子产业的飞速发展,人们的社交似乎离不开网络,这就应运了SNS的飞速发展。从打开QQ空间关注朋友们的动态,最近心情
- 前言常见的例子是在银行账户上:假如要在两个银行账户之间执行交易,你必须确保两个账户都被锁定,不受其他交易的影响,以达到正确的资金转移量。在这
- 前言:我们常常想使用数组的方法,比如forEach,filter,又或者some等等来处理非数组的数据类型,那么在这些场景下,我们就需要将非
- 本文总结分析了selenium2.0中常用的python函数。分享给大家供大家参考,具体如下:新建实例driver = webdriver.
- 1. 传值与传址的区别传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的
- 我就废话不多说了,直接上代码吧!import datetimeimport timedef get_float_time_stamp():
- 一、auth模块# 创建超级用户python manage.py createsuperuserfrom django.contrib im
- 1.引子:函数也是对象木有括号的函数那就不是在调用。def hi(name="yasoob"):return "
- json和dictpython中的dict类型要转换为json格式的数据需要用到json库:import json <json>
- mysql设置字段长度1.关于char和varcharchar是定长字符,varchar是变长字符。在mysql4.0版本之前,char和v