提取两个括号之间的字符串,包括python中的嵌套括号

提取两个括号之间的字符串,包括python中的嵌套括号,python,regex,Python,Regex,如何提取两个括号之间的字符串,包括嵌套的括号 有一个字符串: ""res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)"" 格式不固定,字符串可能包括多个如果s。所以我想知道是否有一个模式可以匹配子字符串。我稍后会尝试给出我的解决方案。谢谢 我的解决方案,如果有更好的方法,请向我指出: def extractIfFunc(condStr): startIndex = [m.start() for m in re.f

如何提取两个括号之间的字符串,包括嵌套的括号

有一个字符串:

""res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)""
格式不固定,字符串可能包括多个
如果
s。所以我想知道是否有一个模式可以匹配子字符串。我稍后会尝试给出我的解决方案。谢谢

我的解决方案,如果有更好的方法,请向我指出:

def extractIfFunc(condStr):

startIndex = [m.start() for m in re.finditer('if\(',condStr)]
parts = []
for index in startIndex:
    current = []
    bracket_level = 0
    for s in condStr[index+3:]:
        if s != '(' and s != ')' and bracket_level >= 0:
            current.append(s)
        elif s == '(':
            current.append(s)
            bracket_level += 1
        elif s == ')':
            bracket_level -= 1 
            if bracket_level < 0:
                current.append(s)
                break
            else:
                current.append(s)     
    parts.append('if('+''.join(current))
return parts  
def extractIfFunc(condStr):
startIndex=[m.start(),表示re.finditer中的m('if\(',condStr)]
部分=[]
对于startIndex中的索引:
当前=[]
括号\u级别=0
对于condStr中的s[索引+3:]:
如果s!='('和s!=')和括号级别>=0:
当前。追加(个)
elif s=='(':
当前。追加(个)
括号_级+=1
elif s==')':
括号\u级别-=1
如果支架水平<0:
当前。追加(个)
打破
其他:
当前。追加(个)
parts.append('if(+''.join(当前))
返回部件
def extractIfFunc(condStr):
对于i,枚举中的段(a.split(“if”)):
如果i==0:
持续
s、 n=-1,0
对于枚举(段)中的i、c:
如果c=='(':
如果s<0,则s=i,否则s
n+=1
elif c==')':
如果n>0,则n=n-1,否则为0
如果n==0且s>-1:
产生“如果(%s)”%段[s+1:i]
打破
a=“”res=sqr(如果((a>b)和(a试试这个:

st[st.find('(')+1:st.rfind(')')]


要匹配任意数量的嵌套对,您可以使用module,请参见
“result=sqrt(如果((a>b)和(aIt看起来像一个固定的字符串操作,但是我会在午餐后编辑并添加一个全局方法,CheesenJoy your Dine:),如果您的所有输入都是“varname=funcname(表达式)”格式“,那么就很容易了——只要找到第一个开始paren的位置,基本上就完成了。现在,如果你想能够解析任意表达式/语句,你需要一个适合这种语言的解析器,不管它是什么。@Brunodesshuilliers,是的,这正是我想要做的。@Jimmy“是的,这正是我想要做的”=>什么?
st = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c))"""

print(st[10:][:-1])
if((a>b)&(a<c),(a+b)*c,(a-b)*c)
import re
st = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c))"""
pattern = "\((.*)\)"
print(re.compile(pattern).search(st).group(1))
if((a>b)&(a<c),(a+b)*c,(a-b)*c)
st[st.find('(')+1:st.rfind(')')]
>>> import re
>>> s = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)"""
>>> re.findall(r'if\((?:[^()]*|\([^()]*\))*\)', s)
['if((a>b)&(a<c),(a+b)*c,(a-b)*c)', 'if()', 'if()']
>>> lvl2 = re.compile('''
...          if\(            #literal if(
...            (?:           #start of non-capturing group
...             [^()]*       #non-parentheses characters
...             |            #OR
...             \([^()]*\)   #non-nested pair of parentheses
...            )*            #end of non-capturing group, 0 or more times
...          \)              #literal )
...          ''', flags=re.X)
>>> re.findall(lvl2, s)
['if((a>b)&(a<c),(a+b)*c,(a-b)*c)', 'if()', 'if()']