Python 正则表达式实现计算器功能


Posted in Python onApril 29, 2017

需求:

用户输入运算表达式,终端显示计算结果

代码:

# !/usr/bin/env/ python3
# -*- coding: utf-8 -*-

"""用户输入计算表达式,显示计算结果"""

__author__ = 'Jack'

import re

bracket = re.compile(r'\([^()]+\)') # 寻找最内层括号规则
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 寻找除法运算规则
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 寻找加法运算规则
sub = re.compile(r'(\d+\.?\d*--\d+\.?\d*)|(\d+\.?\d*-\d+\.?\d*)') # 寻找减法运算规则
c_f = re.compile(r'\(?\+?-?\d+\)?') # 检查括号内是否运算完毕规则
strip = re.compile(r'[^(].*[^)]') # 脱括号规则

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('('): # 若用户输入的表达式首尾无括号,则统一格式化为:(表达式)
    s = str('(%s)' % s)
   while bracket.search(s): # 若表达式s存在括号
    s = s.replace('--', '+') # 检查表达式,并将--运算替换为+运算
    s_search = bracket.search(s).group() # 将最内层括号及其内容赋给变量s_search
    if div.search(s_search): # 若除法运算存在(必须放在乘法之前)
     s = s.replace(s_search, Div(s_search)) # 执行除法运算并将结果替换原表达式
    elif mul.search(s_search): # 若乘法运算存在
     s = s.replace(s_search, Mul(s_search)) # 执行乘法运算并将结果替换原表达式
    elif sub.search(s_search): # 若减法运算存在(必须放在加法之前)
     s = s.replace(s_search, Sub(s_search)) # 执行减法运算并将结果替换原表达式
    elif add.search(s_search): # 若加法运算存在
     s = s.replace(s_search, Add(s_search)) # 执行加法运算并将结果替换原表达式
    elif c_f.search(s_search): # 若括号内无任何运算(类似(-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()

运行效果:

Python 正则表达式实现计算器功能

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
python中的装饰器详解
Apr 13 Python
Python中列表的一些基本操作知识汇总
May 20 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python 对字典按照value进行排序的方法
May 09 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
tensorflow 模型权重导出实例
Jan 24 Python
Python调用C/C++的方法解析
Aug 05 Python
python中类变量与成员变量的使用注意点总结
Apr 29 #Python
Python urls.py的三种配置写法实例详解
Apr 28 #Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 #Python
Python 通过pip安装Django详细介绍
Apr 28 #Python
python 使用get_argument获取url query参数
Apr 28 #Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 #Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 #Python
You might like
php部分常见问题总结
2008/03/27 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
python遍历目录的方法小结
2016/04/28 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
对python3新增的byte类型详解
2018/12/04 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
影视艺术学院毕业生自荐信
2013/11/13 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
网站客服岗位职责
2014/04/05 职场文书
党支部活动策划方案
2014/08/18 职场文书
单位作风建设自查报告
2014/10/23 职场文书
安装工程师岗位职责
2015/02/13 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
pt-archiver 主键自增
2022/04/26 MySQL