标签:return find 正则表达式 else 数字 oat ace 字母数 origin
元字符:
. ^ $ * + ? { } [ ] | ( ) \
特殊符号:
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b: 匹配一个单词边界,也就是指单词和空格间的位置。
1 - 2 * ( (60 - 30 + (-40.0/5) * (9 - 2 * 5/3 + 7 / 3 * 10/4*2 +10 *5/14)) -(-4*3)/(16-3*2))
import re def add_op(arg): # 定义加法函数 arg = arg.replace("++", "+").replace("--", "+").replace("+-", "-").replace("-+", "-") # 替换符号 num = re.findall("([+\-]?\d+\.?\d*)", arg) #匹配所有数字 result = 0 for i in num: #循环数字列表进行累加 result = result + float(i) return result def mul(arg): #定义乘除函数 while True: result = re.split("(\d+\.?\d*[\*/][\+-]?\d+\.?\d*)",arg,1) #匹配乘法或除法 if len(result) == 3: bef,cen,aft = result if "*" in cen: #判断乘号是否在cen里面 num1,num2 = cen.split("*") #将乘号进行分割得到乘数 new_cen = float(num1) * float(num2) #将乘数相乘得到乘积 arg = bef +str(new_cen) + aft #将乘积放入新的字符串表达式 elif "/" in cen: #判断除号是否在cen里面 num1,num2 = cen.split("/") #分割除号得到除数和被除数 new_cen = float(num1) / float(num2) #进行除法运算 arg = bef + str(new_cen) + aft #将商放入新的字符串表达式 else: return add_op(arg) def calc(arg): while True: arg = arg.replace(" ","") result = re.split("\(([^()]+)\)",arg,1) #匹配最里面的括号并且只取括号中的内容 if len(result) == 3: bef,cen,aft = result # 计算括号中的表达式,先乘除后加减,得到计算结果 r = mul(cen) #使用计算结果组成新的字符串表达式 arg = bef + str(r) + aft else: #计算完括号后开始按照先乘除再加减的运算 return mul(arg) origin = "1 - 2 * ( (60 - 30 + (-40.0/5) * (9 - 2 * 5/3 + 7 / 3 * 10/4*2 +10 *5/14)) -(-4*3)/(16-3*2))" r = calc(origin) print(r) print(eval(origin))
标签:return find 正则表达式 else 数字 oat ace 字母数 origin
原文地址:http://www.cnblogs.com/Jiayongxu/p/6789676.html