[ Python - 6 ] 正则表达式实现计算器功能
要求:禁止使用eval函数。参考网上代码如下:
#!_*_coding:utf-8_*_ """用户输入计算表达式,显示计算结果""" import re a = '2+(6/3-2+(1*4))'
# 取最内层的括号
bracket = re.compile('\([^()]+\)') # 加法
add = re.compile('(-?\d+\.?\d*\+\d+\.?\d*)|(-?\d+\.?\d*\+-\d+\.?\d*)') # 减法
sub = re.compile('(\d+\.?\d*-\d+\.?\d*)|(\d+\.?\d*--\d+\.?\d*)') # 乘法
mul = re.compile('(\d+\.?\d*\*\d+\.?\d*)|(\d+\.?\d*\*-\d+\.?\d*)') # 除法
div = re.compile('(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 检查括号内是否运算完毕
c_f = re.compile('\(?\+?-?\d+\)?') # 去掉括号
strip = re.compile('[^(].*[^)]') def Add(s):
'''加法运算'''
exp = re.split('\+', add.search(s).group())
return s.replace(add.search(s).group(), str(float(exp[0]) + float(exp[1]))) def Sub(s):
'''减法运算'''
exp = re.split('-', sub.search(s).group())
return s.replace(sub.search(s).group(), str(float(exp[0]) - float(exp[1]))) def Mul(s):
'''乘法运算'''
exp = re.split('\*', mul.search(s).group())
return s.replace(mul.search(s).group(), str(float(exp[0]) * float(exp[1]))) def Div(s):
'''除法运算'''
exp = re.split('/', div.search(s).group())
return s.replace(div.search(s).group(), str(float(exp[0]) / float(exp[1])))
def calc():
while True:
s = input('Please input the expression(q for quit):')
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存在括号
# print('---')
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(s)
# print('The answer is: %.2f' %(float(s))) if __name__ == '__main__':
print(eval('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'))
calc()
[ Python - 6 ] 正则表达式实现计算器功能的更多相关文章
- python实现简单的计算器功能
如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...
- Python之实现简单计算器功能
一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...
- Python-正则表达式实现计算器功能
需求: 用户输入运算表达式,终端显示计算结果 源代码: # !/usr/bin/env/ python3 # -*- coding: utf-8 -*- """用户输入计 ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- Python 进阶 - 正则表达式
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- python study - 正则表达式
第 7 章 正则表达式 7.1. 概览 7.2. 个案研究:街道地址 7.3. 个案研究:罗马字母 7.3.1. 校验千位数 7.3.2. 校验百位数 7.4. 使用 {n,m} 语法 7.4.1. ...
- python的正则表达式 re
python的正则表达式 re 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一 ...
- Python之正则表达式(re模块)
本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 正则表达式(Regluar Expressions)又称规则 ...
随机推荐
- Python——数据类型之dict
字典,相当于一个列表,不过列表的索引是数字,字典的索引是数字或者字符串. 1.字典的访问 字典是典型的key-value结构,一个key对应着一个value,key就是索引,value就是要保存的值 ...
- 在Android Studio中创建(或添加)第一个Hello World应用程序
下面我们将使用Android Studio创建第一个简单的Hello World应用程序. 1.打开Android Studio,加载画面如下图所示: 2.选择”Start a new Andro ...
- MongoDB Linux下的安装和启动
1. 下载MongoDB,此处下载的版本是:mongodb-linux-i686-1.8.1.tgz.tar. http://fastdl.mongodb.org/linux/mongodb-linu ...
- 剑指offer:斐波那契数列
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...
- Java 中的异常和处理详解(转载)
原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函 ...
- 基于网络的 Red Hat 无人值守安装
基于网络的 Red Hat 无人值守安装 本文介绍了 PC 平台上的一种快速 Red Hat Linux 安装方案.它具有很高的自动化程度--用户只需手工启动机器并选择从网络启动,就可以完成整个安装过 ...
- [剑指Offer] 29.最小的K个数
[思路1]全排序(快排)之后取出前K个数.O(K+nlogn) class Solution { public: vector<int> GetLeastNumbers_Solution( ...
- require.js 模块化
什么是模块化? 将若干功能进行封装,以备将来被重复使用. 为什么要前端模块化? 将公共功能进行封装实现复用 灵活解决依赖 解决全局变量污染 如何实现前端模块化? <!DOCTYPE html&g ...
- android 与 小米1S刷机学习
本文内容为本博客作者原创,转载请注明出处或者发私信. [名词] 1.ROM包 :安卓手机系统,以.ZIP结尾,类似windows的 win7系统包,300M-700M不止 2.卡刷(Recovery模 ...
- [bzoj3886] [USACO15JAN]电影移动Moovie Mooving
题目链接 状压\(dp\). 注意到\(n\leq 20\)且每个只能用一次,所以很显然可以压缩每部电影看过没,记\(f[sta]\)为状态为\(sta\)时最多可以看多久. 转移时先枚举状态,然后枚 ...