[Python笔记]第九篇:re正则表达式
2016-05-17 22:51
483 查看
一、正则表达式基础
1.正则表达式介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。 下图展示了使用正则表达式进行匹配的流程:
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。
下图列出了Python支持的正则表达式元字符和语法:
#!/usr/bin/env python #-*- coding: utf-8 -*- import re origin = "1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" print("***** 原始等式 *****") print(origin) # print(eval(origin)) def add_sub(origin): """ 非常不优雅的加减法实现: 如果表达式以"-"开头: 去掉开头的"-" 如果里面是"+": 如果里面a > b 则a - b,加上负号 如果里面a < b 则b - a,不加负号 如果里面是"-": 如果里面a > b 则a + b,加上负号 如果里面a < b 则b + a,加上负号 """ # 处理两个数字之间多个运算符的情况 origin = origin.replace('--','+').replace('++','+').replace('-+','-').replace('+-','-') # 匹配结果 result = re.split("(\-?\d+\.?\d*[+-][\-]?\d+\.?\d*)", origin, 1) # 判断上一次匹配是否成功 if len(result) == 3: front,middle,end = result # 判断是否以"-"开头 if str(middle).startswith("-"): middle = str(middle).lstrip("-") # 等式里面是"+" if "+" in middle: a, b = middle.split("+") if a > b: new_middle = float(a)-float(b) new_exp = front + "-" + str(new_middle) + end origin = new_exp return add_sub(origin) elif a < b: new_middle = float(b)-float(a) new_exp = front + str(new_middle) + end origin = new_exp return add_sub(origin) elif a == b: new_exp = front + end origin = new_exp return add_sub(origin) elif "-" in middle: a, b = middle.split("-") if a > b: new_middle = float(a)-float(b) new_exp = front + "-" + str(new_middle) + end origin = new_exp return add_sub(origin) elif a < b: new_middle = float(a)+float(b) new_exp = front + "-" + str(new_middle) + end origin = new_exp return add_sub(origin) elif a == b: new_exp = front + end origin = new_exp return add_sub(origin) # 不是以"-"开头 else: if "+" in middle: a, b = middle.split("+") new_middle = float(a)+float(b) new_exp = front + str(new_middle) + end origin = new_exp return add_sub(origin) elif "-" in middle: a, b = middle.split("-") new_middle = float(a)-float(b) new_exp = front + str(new_middle) + end origin = new_exp return add_sub(origin) else: return origin """ #更优雅的加减法 def add_sub(arg): # 加减法运算 arg = arg.replace('--','+').replace('++','+').replace('-+','-').replace('+-','-') result = re.findall(r"[\+\-]?\d+\.?\d*",arg) # 列出所有的元素 start = 0 # 定义空值让他挨个去加 for i in result: start += float(i) # 让素有元素相加 return start # 返回运算结果 """ def ply_div(origin): result = re.split("(\d+\.?\d*[*/][\-]?\d+\.?\d*)", origin, 1) if len(result) == 3: front,middle,end = result # 遇到*则乘法 if "*" in middle: a, b = middle.split("*") new_middle = float(a)*float(b) new_exp = front + str(new_middle) + end origin = new_exp return ply_div(origin) # 遇到/则除法 elif "/" in middle: a, b = middle.split("/") new_middle = float(a)/float(b) new_exp = front + str(new_middle) + end origin = new_exp return ply_div(origin) else: return add_sub(origin) def compute(origin): x = ply_div(origin) # 乘除操作 return x # 返回 while True: result = re.split("\(([^()]+)\)", origin, 1) if len(result) == 3: before, content, after = result r = compute(content) # 计算字符串 new_str = before + str(r) + after origin = new_str else: final = compute(origin) # 计算字符串 print("***** 最终结果 *****") print(final) break
计算器源码
相关文章推荐
- python
- python学习笔记5—数据类型转换
- python range() 和xrange()的区别
- python交互模式下方向键、退格键出现乱码及ipython的安装
- 练习010
- 理解Python中的with…as…语法
- Python scrapy 实现网页爬虫
- 用字典创建一个平台的用户信息(包含用户名和密码)管理系统
- LeetCode Reverse Words in a String
- python笔记之ArcPy简介
- 用交叉验证改善模型的预测表现(适用于Python和R)
- python笔记之ArcPy函数列表
- Python Day2 数据类型: 列表元组和字典
- 关于Python验证码识别安装PIL、tesseract-ocr与pytesseract模块的错误解决
- 图的DFS遍历(python版本)
- Python is和==区别
- python学习笔记,长期记录不会的知识
- python matplotlib 中文显示参数设置
- python部落刷题宝备忘(一)
- Python Enumerate