查找数学表达式中最外面的括号中包含的文本

时间:2019-04-17 04:17:39

标签: python regex python-3.x

我正在尝试查找函数filt()的最外括号中包含的文本。

该函数是数学表达式字符串的一部分:

onBindViewHolder

预期输出为:

math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"

我已经尝试过在此站点上使用多个正则表达式,我得到的最接近的输出是使用['2*A', 'A*(B+C)', '(A+B)/(C+D)'] 。但是,正则表达式返回:

re.findall('\((.*?)\)', math_expr)

有人可以帮我吗?我是regex的新手,不知道还能尝试什么。谢谢!

3 个答案:

答案 0 :(得分:2)

如果使用支持递归模式的正则表达式模块,则可以使用

regex.findall(r'\(((?:[^()]+|(?R))+)\)', math_expr)

输出:

['2*A', 'A*(B+C)', '(A+B)/(C+D)']

https://regex101.com/r/oclWxx/1

  • \(-前导括号
  • ((?:[^()]+|(?R))+)-捕获组,该组重复匹配:
    • [^()]+-除括号外的所有内容,或
    • (?R)-整个模式再次出现
  • \)-尾括号

答案 1 :(得分:1)

只是一个非常简单的选择

>>> import re

>>> math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"

>>> re.findall(r'\(([\S]*?)\)(?=\s|$)', math_expr)


#OUTPUT
['2*A', 'A*(B+C)', '(A+B)/(C+D)']

答案 2 :(得分:0)

我已经使用堆栈方法对其进行了编码。它只是将(放入堆栈中,然后在您看到)时从堆栈中弹出。

math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"
stack = []
index = 0
overallresult = []
while (index < len(math_expr)):
    if math_expr[index] == '(':
        stack.append('(')
        result = ''
        index +=1
        while(index<len(math_expr) and len(stack)>0):
            result += math_expr[index]
            if(math_expr[index]=='('):
                stack.append('(')
            elif (math_expr[index]==')'):
                stack.pop()
            index+=1
        overallresult.append(result[:-1])
    index+=1
print(overallresult)

输出

['2*A', 'A*(B+C)', '(A+B)/(C+D)']