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实现的希尔排序算法实例
Jul 01 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python下10个简单实例代码
Nov 15 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
python解析含有重复key的json方法
Jan 22 Python
python按照多个条件排序的方法
Feb 08 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python实现不规则图形填充的思路
Feb 02 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
PHP 全角转半角实现代码
2010/05/16 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
linux iconv方法的使用
2011/10/01 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
Python字符串拼接的几种方法整理
2017/08/02 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
GWebs公司笔试题
2012/05/04 面试题
公司离职证明范本
2014/01/13 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
招标保密承诺书
2015/01/20 职场文书
地陪导游欢迎词
2015/01/26 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
死者家属慰问信
2015/03/24 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书