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生成器generator之next和send的运行流程(详解)
May 08 Python
Python入门_条件控制(详解)
May 16 Python
快速查询Python文档方法分享
Dec 27 Python
Python实现定时精度可调节的定时器
Apr 15 Python
python实现图片转字符小工具
Apr 30 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
深入学习python多线程与GIL
Aug 26 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
python调用百度API实现人脸识别
Nov 17 Python
Github 使用python对copilot做些简单使用测试
Apr 14 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分页函数
2006/10/09 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js取得url地址参数实例
2013/02/22 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
vue实现图书管理demo详解
2017/10/17 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python实现一组典型数据格式转换
2018/12/15 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
python绘制高斯曲线
2021/02/19 Python
python实现控制台输出颜色
2021/03/02 Python
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
我们的节日清明节活动总结
2014/04/30 职场文书
学校与家长安全责任书
2014/07/23 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
五五普法心得体会
2014/09/04 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
大学军训决心书
2015/02/05 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL