代码感觉有点绕,刚开始学习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. React父子组件间的传值

    父组件: import React, { Component } from 'react'; import Child from './chlid'; class parent extends Com ...

  2. 模板 - 线性递推BM

    模数是998244353的话好像NTT可以更快. #include<bits/stdc++.h> using namespace std; typedef long long ll; co ...

  3. MySQL5.7 慢查询+DDL操作堵塞查询

    数据库版本: mysql> select @@version; +------------+ | @@version | +------------+ | 5.7.26-log | +----- ...

  4. Vue学习之旅:todomvc的学习练习

    一.前奏 1.todomvc官网地址:http://todomvc.com/ 查阅文档和下载插件都可以到这个官网上找. 2.上GitHub上搜索下载有人做的现成的本地模板:进入GitHub搜索todo ...

  5. Js中className的用法

    className可以用来改变标签元素的css类选择器,从而改变元素的样式 举个栗子 一个简单的无序列表,点击button之前ul的样式为uhh1 点击button后,调用check函数中的class ...

  6. linux下挂载U盘方法

    1.使用 cat /proc/partitions 查看系统现在有哪些分区:[root@localhost ~]# cat /proc/partitions major minor  #blocks  ...

  7. webpack webpack.config.js配置

    安装指定版本的webpack npm install webpack@3.6 -g 安装live-server    运行项目插件   输入live-server  运行后自动打开网页 npm ins ...

  8. split 分割文件

    1.命令功能 split将文件分割成多个碎片文件. 2.语法格式 split  option  input  prefix split  选项    输入文件名   输出文件名前缀 参数说明 参数 参 ...

  9. oracle 汇编04

    General-Purpose Instructions The general-purpose instructions perform basic data movement, memory ad ...

  10. [python 学习] requests 库的使用

    1.get请求 # -*- coding: utf-8 -*- import requests URL_IP = "http://b.com/index.php" pyload = ...