import re def f(s,i=0): t=re.sub(r"^\(*|\)*$","",s) u=re.findall("\(*\w+\)*",t) print(u) def f(s): if s[0]+s[-1]=="()": if s[-1]==")": return f(s[1:-1]) else: return s return s # Cases: a(b), (a)b, (a)(b) def f(s): a,b=s.index("("),s.rindex(")") def f(s): q=r"([^\(\)])" t=re.sub(q+r"\(*"+q+"\)*"+q,"",s) def f(s): q=r"\b" if m:=re.search(q+".+?"+q,s): return m def f(s): if m:=re.search(r"[^\(\)]+",s): print(m.start(),m.end(),m) if m.start()==0: pass #print(f("((abc(be)(de)))")) test={ "(alpha)": "alpha", "(((([))))": "[", " beta(gamma)": " beta(gamma)", "@lpha((lambda))": "@lpha(lambda)", "(phi((theta)pi))": "phi((theta)pi)", "(sigma)(omega)": "(sigma)(omega)", "(sig(ma)(om)e;a)": "sig(ma)(om)e;a", "(((((a)))b))": "(a)b", "((b(((a)))))": "b(a)", "b((a$c)(def))": "b((a$c)(def))", "x(((y)(z)))": "x((y)(z))", "(foo(bar))baz": "(foo(bar))baz", "foo((bar)baz)": "foo((bar)baz)", "(((((a)(b)))c))": "((a)(b))c", "((c(((b)(a)))))": "c((b)(a))", } for i,o in test.items(): print(i,"\t\t",f(i))