常规表达式转换为后缀表达式


#coding=utf-8
#------------------------------------------------------------------------------#
import re
#------------------------------------------------------------------------------#
#算术表达式规则
ARITEXP_RULE = \
{
    'PARA': '[\.\w]+',                          #参数匹配正则表达式
    'OP': '[\+\-\*\/\(\)]',                        #运算符匹配正则表达式
    "PRI": {'*':2, '/':2, '+':1, '-':1}         #运算符优先级(从高到低)
}
#关系表达式规则
RELATEXP_RULE = \
{
    'PARA': '[^\&\|\!\(\)]+',                 #参数匹配正则表达式
    'OP': '[\&\|\!\(\)]',                         #运算符匹配正则表达式
    'PRI': {'!':3, '&':2, '|':1}                #运算符优先级
}
#------------------------------------------------------------------------------#
#常规表达式转换为后缀表达式
class CConvExp(object):
    def __init__(self, strexp, exprule): 
        self.rule = exprule
        self.exp = self.conv(strexp)
        
    def conv(self, exp):
        newexp = []
        stack = []
        for e,t in self.get_elem(exp):
            if t == 'para':
                newexp.append(e)
            elif t == 'op':
                if stack==[] or e=='(':
                    stack.append(e)
                elif e == ')':
                    if '(' not in stack:
                        print 'ERROR: The expression: %s is wrong!' % exp
                        return
                    op = stack.pop()
                    while op != '(':
                        newexp.append(op)
                        op = stack.pop()
                elif stack[-1]=='(':
                    stack.append(e)
                else:
                    while(True):
                        if self.high_op(e, stack):
                            stack.append(e)
                            break
                        else:
                            newexp.append(stack.pop())
        for op in reversed(stack):
            newexp.append(op)                            
        return newexp
            
    def get_elem(self, exp):
        idx, length = 0, len(exp)
        while idx < length:
            if exp[idx] == ' ':
                continue
            elif re.match(self.rule['OP'], exp[idx]):
                yield exp[idx], 'op'
            elif re.match(self.rule['PARA'], exp[idx:]):
                para = re.findall(self.rule['PARA'], exp[idx:])[0]
                idx += len(para)-1
                yield para, 'para'
            else:
                print 'ERROR: The expression: %s is wrong!' % exp
                return
            idx += 1
        return
                
    def high_op(self, op, stack):
        if stack == []:
            return True     
        if self.rule['PRI'][op] > self.rule['PRI'][stack[-1]]:
            return True
        return False
    
          
#------------------------------------------------------------------------------#
if __name__ == '__main__':
    str1 = r'a+b*(c-(d+e))' 
    str2 = r'!(a+b)|c&d[0:3]'
    exp1 = CConvExp(str1, ARITEXP_RULE)
    exp2 = CConvExp(str2, RELATEXP_RULE)
    print exp1.exp
    print exp2.exp


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值