python分割并求值

| 如何将带后缀的字符串拆分为带括号的字符串?我的意思是,如果用户输入“ 0”,我希望解释器能够乘以“ 1”并理解文本中的括号。这可能吗?像
str.split()
,但带有开始和结束定界符? 我不现实吗?我发现
shlex
模块类似,但仅引用了AFAIK。     
已邀请:
        我认为使用ѭ4并不是一个坏主意。您只需一次将嵌套括号替换为它们的操作结果即可。对我来说似乎很简单:
import re
regex = re.compile(r\'\\([^\\(\\)]+\\)\')

def eval_expr(expr):
    match = regex.search(expr)
    if match:
        sub_expr = match.group()
        return eval_expr(expr.replace(sub_expr, str(eval_expr(sub_expr[1:-1]))))
    args = expr.split()
    op = args.pop()
    return eval(op.join(args))
像这样使用:
>>> eval_expr(\'(1 (2 3 -) 4 +) (5 6 *) 7 +\')
<<< 41
    
           我对正则表达式不是很熟悉。要求为这个例子举例太多吗? 就像克里斯的,呃,杂色的注释所示,您不能有一个(true)正则表达式来解析嵌套的括号。 (根据他的说法,有一些hack和扩展程序可以扩展表达式语言,使其能够解析上下文无关的语法。这是我第一次听说,但这听起来对我来说是个坏主意。 )   这个答案似乎也很糟糕...还有其他方法可以做到吗? 读这个。     
        您可以编写一个正则表达式来提取带括号的子表达式。如果您所关心的是在匹配的括号上分开,7可能会有所帮助。一个简单的正则表达式可以让您选择子表达式。
#!/usr/bin/env python
import re
source = r\"3 (3 6 *) *\"
rewritten = source[:]
match_index = 1
snag_deepest = re.compile(r\"\"\"(?P<pre>.*)(?P<sub>\\([^()]+\\))(?P<post>.*)\"\"\")

print \"Starting -> %s\" % (rewritten)
results = snag_deepest.search(rewritten)
while results is not None:
    print \"Subexpression %d -> %s\" % (match_index, results.group(\'sub\'))
    rewritten = \"%s%s%s\" % (results.group(\'pre\'), \"sub_%d\" % match_index, results.group(\'post\'))
    print \"Rewritten as -> %s\" % (rewritten)
    results = snag_deepest.search(rewritten)
    match_index += 1
产生
Starting -> 3 (3 6 *) *
Subexpression 1 -> (3 6 *)
Rewritten as -> 3 sub_1 *
    
        首先,请了解,在知道运算符的熟悉程度后,在后缀表示法中不需要括号。要了解原因:
3 3 6 * *
从左侧开始,堆叠操作数,直到遇到运算符:
operands <- 3 <- 3 <- 6
operator: *
我们知道ѭ12是二进制运算符,因此将两个操作数从堆栈中弹出,应用该运算符,然后将结果推回去:
operands -> 3 -> 6
operands <- 18
继续累积操作数,直到遇到另一个运算符:
operator: *
operands -> 3 -> 18
operands <- 54
当表达式被使用时(假设其格式正确),堆栈将包含一个值:结果。 但是您的问题是关于括号的:假设您希望能够解析任意嵌套的括号,出于此处说明的原因,正则表达式将无济于事。您需要一些可以识别上下文无关语法的东西,即下推自动机。 但是,我认为,您所寻求的不仅仅是抽象的计算机科学知识;这是一个相关问题,其中包含有关Shunting Yard算法的一些有用信息,该算法将带括号的中缀表达式转换为后缀表达式。 编辑:好的,我应该说“单独使用真正的正则表达式对您没有帮助。” 。但是Shunting Yard算法比较酷:)     
        如果我错了,请纠正我,但您的表情是RPD。如果是这样,则没有实际需要使用括号。请在下面找到我的样本(未优化且很奇怪):
import operator

def rpd_eval(expression):
    if expression.count(\'(\') != expression.count(\')\'):
        return 0    
    expression = expression.replace(\' \', \'\')
    ops = {\'*\': operator.mul, \'**\': operator.pow, \'%\': operator.mod,
           \'+\': operator.add, \'-\': operator.sub, \'/\': operator.div,
           \'^\': operator.pow}        
    res = []
    for v in list(expression):
        if not v in ops and v not in [\'(\',\')\']:
            res.append(int(v))
        elif v not in [\'(\',\')\']:
            b = float(res.pop())
            a = float(res.pop())
            res.append(ops[v](a, b))
    return res[0]

print rpd_eval(\'3(63*)*5+\') # will print 59
    

要回复问题请先登录注册