将“√9-1”转换为“ sqrt(9)-1”

时间:2019-11-12 04:51:45

标签: python

我有一个像“ 2 +√√81.0-1” 这样的字符串。我想将此字符串转换为“ 2 + sqrt(sqrt(81.0))-1” 。我有一个算法在做这种转换:

import re

val = ["2", "+", "√", "√", "8", "1", ".", "0", "-", "1"]

find_sqrt = 0
for n, i in enumerate(val):
    if i == "√":
        val[n] = "sqrt("
        find_sqrt += 1
        continue
    if (re.match(r"\D[^.√]", i)) and (find_sqrt > 0):
        val[n-1] += ")" * find_sqrt
        find_sqrt = 0

if find_sqrt > 0:
    val.append(")" * find_sqrt)
    find_sqrt = 0

print(''.join(val))

但是在输出中,我有“ 2 + sqrt(sqrt(81.0-1))” 。由于某种原因,我的正则表达式看不到“-”并跳过了它。

我需要帮助来修复我的正则表达式。而且,如果您知道将“√9-1”转换为“ sqrt(9)-1”的简便方法,我将很高兴为您提供帮助!

2 个答案:

答案 0 :(得分:2)

使用堆栈来正确关闭括号。

val = ["2", "+", "√", "√", "8", "1", ".", "0", "-", "1"]
stack = []
result=[]
stackresult=[]
index=0
while(index<len(val)):
    if val[index] == "√":
        stack.append(val[index])
        for iterator in range (index+1,len(val)):
            if val[iterator] == "-": #check for all operator here (or all ops)
             while(len(stack)!=0):
                 stack_pop=stack.pop()
                 if(stack_pop=="√"):
                  stackresult.insert(0,")");
                  stackresult.append("sqrt(")
                 else:
                  stackresult.append(stack_pop);
             stackresult.reverse()
             result.extend(stackresult)   
             break
            else:
              stack.append(val[iterator])
            index+=1
    else:
        result.append(val[index])
    index+=1
print(''.join(result))

了解更多: https://www.geeksforgeeks.org/check-for-balanced-parentheses-in-python/

答案 1 :(得分:0)

您要尝试建立一个解析器。处理单个字符只能满足基本的解析要求。对于这样的事情,您应该使用Lexer,以便将45+32之类的字符串拆分为

block1 - 45 - NUM
block2 - + - TOKEN
block3 - 32 - NUM

使用此操作可以在上下文中执行。请查看此页面以获取详细信息:

Parsing In Python: Tools And Libraries