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语言的12个基础知识点小结
Jul 10 Python
python迭代器实例简析
Sep 25 Python
提升Python程序运行效率的6个方法
Mar 31 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python+selenium实现QQ邮箱自动发送功能
Jan 23 Python
Python generator生成器和yield表达式详解
Aug 08 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
python实现跨年表白神器--你值得拥有
Jan 04 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP 函数执行效率的小比较
2010/10/17 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
php实现算术验证码功能
2018/12/05 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Python中的两个内置模块介绍
2015/04/05 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
简单了解django orm中介模型
2019/07/30 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
入党积极分子思想汇报
2014/01/02 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
中考学习决心书
2015/02/04 职场文书
公司放假通知范文
2015/04/14 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP