提取两个括号之间的字符串,包括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()']