函数加正则实现简单计算器

本实现主要用到正则匹配的知识和函数的知识点完成一个能实现简单的加减乘除的计算器的运算

import re

#乘除运算
def numl_mod(args):
    resurt  = re.compile(‘(\d+\.?\d*)([*/])(\-?\d+\.?\d*)‘)#正则匹配,将匹配出来的结果赋给resurt
    while resurt.search(args):#while循环判断直到算出最终结果
        new_num = resurt.search(args)
        num = new_num.group()#取出原值赋给num
        num1 = float(new_num.group(1))
        num2 = new_num.group(2)#取出来的是 * / 号,在if 处进行判断
        num3 = float(new_num.group(3))

        if num2 == ‘*‘:
            result = num1 * num3#返回 * 的结果
        elif num2 == ‘/‘:
            result = num1 / num3#返回 / 的结果
        args = args.replace(num, str(result), 1)#将计算的结果替换返回
    return args
# print(numl_mod("10*2/5"))

# #加减运算
def poor_add(args):
    resurt = re.compile(‘(\-?\d+\.?\d*)([-+])(\-?\d+\.?\d*)‘)
    while resurt.search(args):
        new_num = resurt.search(args)
        num = new_num.group()
        num1 = float(new_num.group(1))
        num2 = new_num.group(2)
        num3 = float(new_num.group(3))
        if num2 == ‘-‘:
            result = num1 - num3
        elif num2 == ‘+‘:
            result = num1 + num3
        args = args.replace(num, str(result), 1)
    return args

# print(poor_add("3-5+6"))

#检查判断去括号

# origin = "1-2*((60-30+(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)*(-9-2-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*25))"
# origin = input("Enter number >>>>>")
#检测式子的合法性
def check(args):
    flag = True#默认标识位为真
    if re.findall("[a-zA-Z]",args):#检查式子的合法性,不能含有大小写字母
        print("error")
        flag = False
    return flag

#检测运算
def format(args):#检测式子,将 含有空格/++/+-/--等进行替换,返回一个新的式子
    new_args1 = args.replace("++", "+")
    new_args2 = new_args1.replace("+-", "-")
    new_args3 = new_args2.replace("--", "+")
    new_args4 = new_args3.replace("-+", "-")
    new_args5 = new_args4.replace(" ", "")
    new_args6 = new_args5.replace("*+","*")
    new_args = new_args6.replace("/+","/")
    return new_args

print("--------------")
print("欢迎使用计算机")
print("--------------")
#主代码块
#执行语句块
while True:
    choice = input("请选择 q/Q【退出】 y/Y 【执行】")
    if choice == "q" or choice == "Q":
        print("谢谢您的使用")
        break
    origin = input("Enter number >>>>>")
    if check(origin):
        new_origin = format(origin)
        while re.search("\(",new_origin):#匹配如果有括号,执行下面代码
            new_new_origin = re.search("\([^()]+\)",new_origin).group()#匹配出最里面的括号里的式子
            # print(new_new_origin)
            s = numl_mod(new_new_origin)
            # print(s)
            s1 = poor_add(s)
            s2 = s1[1:-1]
            new_origin = new_origin.replace(new_new_origin, s2, 1)
            # print(new_origin)
            # print(s2, type(s2))
            # break
        else:#括号执行完后执行的代码块
            resurt = numl_mod(new_origin)
            # print(resurt, "resurt")
            # print(resurt)
            new_resurt = poor_add(resurt)
            # a2 = a2[1:-1]
            print(new_resurt)#返回的最终结果,也就是我们要得到的最终计算结果

  

时间: 2024-10-15 04:34:07

函数加正则实现简单计算器的相关文章

j2ee-JSP之简单计算器

来源韩顺平.j2ee视频实战教程jsp第1讲(下集) -------------------------------------------------------------------------------------------------------- 简单计算器,可以控制输入的数(仅第一个数)不能为空且不能为字符串 myCal.jsp代码 1 <!--这是计算器的界面 --> 2 <!-- 可以控制输入的数不能为空且不能为字符串 --> 3 <%@ page co

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

fcntl函数加文件锁

对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是file control的缩写.在linux下大部分设备都是文件,所以fcntl的功能也比较多,包括: Duplicating a file descriptor(复制文件描述符) File descriptor flags(操作close-on-exec标志) File status flags(操作

Shell 实现简单计算器功能

Shell 实现简单计算器功能,脚本如下: [[email protected] scripts]# cat jisuan.sh #!/bin/bash print_usage(){     printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n"     exit 1 } #判断传入的参数是不是3个 if [ $# -ne 3 ]   then     print_usage fi firstnum=$1 secondnum=$3 op=$2 #对传入的参数进

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

菜鸟学Android编程——简单计算器《一》

菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少,加减乘除就可以. 第一步:设计布局文件 界面如下图: 由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件. 注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本). 有关Gri

HDU 1237 简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12832    Accepted Submission(s): 4222 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

重读The C programming Lanuage 笔记三:简单计算器程序

1 //简单计算器 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <ctype.h> 6 #include <string.h> 7 #include <math.h> 8 9 #define MAXOP 100 //max size of operand or operator 10 #define NUMBER '0' //sign of a number was found

PHP函数preg_replace() 正则替换所有符合条件的字符串

PHP preg_replace() 正则替换,与JavaScript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素. preg_replace (正则表达式, 替换成, 字符串, 最大替换次数[默认-1,无数次], 替换次数) 大部分语言的正则表达式都是差不多的,不过也有细微的差异. PHP 正则表达式 正则字符 正则解释 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,“\n”匹配字符“n”.“\\n”匹