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正则表达式re模块详解
Jun 25 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
Python实现八大排序算法
Aug 13 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
Python字典底层实现原理详解
Dec 18 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
python 实现任务管理清单案例
Apr 25 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
爬虫代理的cookie如何生成运行
Sep 22 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
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php DES加密算法实例分析
2019/09/18 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
laravel model 两表联查示例
2019/10/24 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
Vue实现web分页组件详解
2017/11/28 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
Python调用C语言的实现
2019/07/26 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
行政专员工作职责
2013/12/22 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
法人委托书范本
2014/04/04 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
企业总经理任命书
2014/06/05 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL