代码感觉有点绕,刚开始学习python,相关知识点还没全部学习到,还请各位大神多多指教

import re

# 定义乘法
def mul(string):
mul1 = re.search('-?\d+(?:\.\d+)?\*-?\d+(?:\.\d+)?', string)
str1 = mul1.group()
li = re.split('\*', str1)
mul_ret = float(li[0]) * float(li[1])
if mul_ret < 0:
return string.replace(string[mul1.start(): mul1.end()], str(mul_ret))
else:
return string.replace(string[mul1.start(): mul1.end()], '+' + str(mul_ret)) # 定义除法
def div(string):
div1 = re.search('-?\d+(?:\.\d+)?/-?\d+(?:\.\d+)?', string)
str1 = div1.group()
li = re.split('/', str1)
div_ret = float(li[0]) / float(li[1])
if div_ret < 0:
return string.replace(string[div1.start(): div1.end()], str(div_ret))
else:
return string.replace(string[div1.start(): div1.end()], '+' + str(div_ret)) # 定义加法
def add(string):
add1 = re.search('-?\d+(?:\.\d+)?\+-?\d+(?:\.\d+)?', string)
str1 = add1.group()
li = re.split('\+', str1)
add_ret = float(li[0]) + float(li[1])
return string.replace(string[add1.start(): add1.end()], str(add_ret)) # 定义减法
def sub(string):
sub1 = re.search('-?\d+(?:\.\d+)?--?\d+(?:\.\d+)?', string)
str1 = sub1.group()
if str1[0] == '-':
str1 = str1[1:]
li = re.split('-', str1, 1)
sub_ret = 0 - float(li[0]) - float(li[1])
return string.replace(string[sub1.start(): sub1.end()], str(sub_ret))
else:
li = re.split('-', str1, 1)
sub_ret = float(li[0]) - float(li[1])
return string.replace(string[sub1.start(): sub1.end()], str(sub_ret)) # 去除括号
def brackets(string):
string = re.sub(r' ', '', string)
n = string.count('(')
while n:
n -= 1
m1 = re.search('(?<=\()[^\(\)]*(?=\))', string)
str1 = m1.group()
str1_ret = cal(str1)
string = string.replace(string[m1.start() - 1: m1.end() + 1], str(str1_ret))
return string # 定义不含括号的运算
def cal(string):
li1 = re.findall('\*|/', string)
for i in li1:
if i == '*':
string = mul(string)
elif i == '/':
string = div(string)
if string[0] == '-' or '+':
string = '0' + string
li2 = re.findall('\+|-', string)
n = len(li2)
while n:
string = string.replace('+-', '-')
string = string.replace('--', '+')
string = string.replace('-+', '-')
string = string.replace('++', '+')
n -= 1
li3 = re.findall('\+|-', string)
for i in li3:
if i == '+':
string = add(string)
elif i == '-':
string = sub(string)
return string
def jm_cal(string): 
  cal_ret = cal(brackets(string))
  return cal_ret

输入:

s = '-45 + 15 * (12 - 68 / (11 - 5 * 2 + (-9 )/ 4)* 6) / 4 + 6 - (14 / 9 + 8 * (-7) - 6 * 2 + 13) * 12'
print(jm_cal(s))

输出:

1871.3333333333333

与直接调用eval()内置函数计算结果一致

利用正则表达式模拟计算器进行字符串的计算实现eval()内置函数功能的更多相关文章

  1. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  2. JQUERY选择和操作DOM元素(利用正则表达式的方法匹配字符串中的一部分)

    JQUERY选择和操作DOM元素(利用正则表达式的方法匹配字符串中的一部分) 1.匹配属性的开头 $("[attributeName^='value']"); 2.匹配属性的结尾 ...

  3. php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数?

    php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数? 一.总结 php实现计算字符个数(php标准输入和输出:fgets(STDIN)  echo $output;) 1.php标准输 ...

  4. mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式

    mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式 示例:分隔符一致,年月日要用%号 select str_to_date('2008-4-2 15:3:28', ...

  5. python基础-匿名函数、内置函数、正则表达式、模块

    1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): ...

  6. python整型-浮点型-字符串-列表及内置函数(上)

    整型 简介 # 是否可变类型: 不可变类型 # 作用:记录年龄.手机号 # 定义: age = 18 # --> 内部操作 age = int(18) # int('sada') # 报错 in ...

  7. PHP不使用内置函数intval(),实现字符串转整数

    平时我们用PHP时,将字符串转化为整型时,一般都是使用 intval() 内置函数,那么如果我们自己写,怎么写一个呢? 此时我们可以利用 ASCII 码计算得整数的特性,因为每个字符都对应一个 ASC ...

  8. Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数

    dual单行单列的隐藏表,看不见 但是可以用,经常用来调内置函数.不用新建表 时间函数 sysdate 系统当前时间 add_months 作用:对日期的月份进行加减 写法:add_months(日期 ...

  9. Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

    Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格 ...

随机推荐

  1. java 线程池(线程的复用)

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...

  2. python学习笔记(7)文件的访问与函数式编程

    一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...

  3. org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [dx.service.ItemService] found for dependency

    在整合ssm框架,测试service层的时候报错 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: ...

  4. unity2017 光照与渲染(一)

    光照&渲染(基于unity2017.2.0) Custom Skybox 天空盒 最丰富的环境光 a. TextureShape 改成 Cube. b. 把图片直接丢给天空,就会自动生成材质. ...

  5. linux设定 runlevel 3

    runlevel 查看当前系统运行级别 vi /etc/inittab //运行级别配置文件

  6. 3-基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台

    基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台   一.板卡概述 板卡由我公司自主研发,基于VPX架构,主体芯片为两片 TI DSP TMS320C6678,两片V ...

  7. WebAuthorize(中间件对所有请求进行拦截)core只有通过添加中间件过滤请求方式 而非继承然后写特性的那种方式

    一.WebAuthorize 1.项目名称 WebAuthorize 2.加个中间件 过滤请求. using Microsoft.AspNetCore.Builder; using Microsoft ...

  8. HDU-6038 Function 思维+循环节

    解法:这道题很有意思,值得一做和细细思考. 首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循 ...

  9. spring boot 集成 websocket 实现消息主动推送

    spring boot 集成 websocket 实现消息主动 前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单 ...

  10. springboot操作rabbitmq

    ////DirectExchange directExchange = new DirectExchange("test.direct");////amqpAdmin.declar ...