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读取sqlite数据库文件的方法分析
Aug 07 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
django中forms组件的使用与注意
Jul 08 Python
django中瀑布流写法实例代码
Oct 14 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
python实现字符串和数字拼接
Mar 02 Python
django 扩展user用户字段inlines方式
Mar 30 Python
Python实现一个优先级队列的方法
Jul 31 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
python实现图片转字符画的完整代码
Feb 21 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 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 COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
对Python中range()函数和list的比较
2018/04/19 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
YUV转为jpg图像的实现
2019/12/09 Python
python自动下载图片的方法示例
2020/03/25 Python
python 如何设置守护进程
2020/10/29 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
护士试用期自我鉴定
2014/02/08 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
2016年公司新年寄语
2015/08/17 职场文书
优质护理心得体会
2016/01/22 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL