我正在尝试查找函数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的新手,不知道还能尝试什么。谢谢!
答案 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)']