您的位置:首页 > 编程语言 > Python开发

[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


计算器源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: