# !/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 = sub.search(s).group()
if exp.startswith('-'): #如果表达式形如:-2.2-1.2;需变换为:-(2.2+1.2)
exp = exp.replace('-', '+') #将-号替换为+号;+2.2+1.2
res = Add(exp).replace('+', '-') #调用Add运算,将返回值+3.4变为-3.4
else:
exp = re.split(r'-', exp)
res = str(float(exp[0]) - float(exp[1]))
return s.replace(sub.search(s).group(), res) 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() 使用正则表达式实现计算器功能

crontab正则验证

Python 正则实现计算器的更多相关文章

  1. Python正则表达计算器

    Python学习笔记(十二): 计算器 利用Python的正则表达式写的简易计算器 # author : Ryoma # time : 17:39 import re def add(string): ...

  2. Python实例---利用正则实现计算器[FTL版]

    import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = ...

  3. python正则实现简单计算器

    利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...

  4. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  5. python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  6. python 正则使用笔记

    python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...

  7. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  8. Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...

  9. Python正则替换字符串函数re.sub用法示例(1)

    本文实例讲述了Python正则替换字符串函数re.sub用法.分享给大家供大家参考,具体如下: python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串然后把它替 ...

随机推荐

  1. Idea中配置Tomcat

    配置步骤 在idea项目左上角选择‘Edit Configurations’ 2. 配置server 3. 配置项目 4. 配置成功后就可以在项目下面看到tomcat了 运行Tomcat遇到权限问题: ...

  2. 如何查找CpG Islands, CpG shores等 --转载

    转载自: http://blog.sciencenet.cn/blog-306699-1033567.html 在homo species物种,随着研究的深入,注释信息不断丰富 针对CpG Islan ...

  3. 使用Coding体验小记

    https://coding.net/ 写了些小程序后放在github上托管,并用gitpages展示. 今天发现用git pages展示的网页网络特别不稳定,时常会出现网页打不开的现象. 之前一直通 ...

  4. leecode第四题(寻找两个有序数组的中位数)

    题解: class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<i ...

  5. download 属性

    1.使用场景 对浏览器 识别/不识别 的文件下载 2.核心代码 var eleTextarea = document.querySelector('textarea'); var eleButton ...

  6. centos 7 安装jdk1.8

    首先下载jdk1.8  去官网下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...

  7. Asp.net core 学习笔记 ( HttpClient )

    2018-09-18 core 2.1 之后有新的方案咯 http://www.talkingdotnet.com/3-ways-to-use-httpclientfactory-in-asp-net ...

  8. Axure 设置条件的操作

    登录的三种场景: 1.用户名为空,只输入密码时,执行三个动作:跳出提示内容(用户名为空).光标定位在用户名的文本框中.清空密码的文本框: 2.密码为空,只输入用户名,执行两个操作:跳出提示内容(密码为 ...

  9. 通过cookies跳过验证码登陆页面,直接访问网站的其它URL

    我每次手动访问去NN网的一家酒店,就不需要登陆,一旦我用脚本打开就会让我登陆,而登陆页面又有验证码,不想识别验证码,所以就想:“通过cookies跳过验证码登陆页面,直接访问网站的其它URL”   转 ...

  10. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...