Python 正则表达式从函数中提取表达式?

Python 正则表达式从函数中提取表达式?,python,regex,Python,Regex,以下是一些示例输入: Fxfu(x1,Y,n<X+Y) Fxfu(x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n) Fxfu(x1,Y(n),Z(n)^M(n)<X+Y) Fxfu(x1,(n,A,B),Z(n)^M(n)<T(n,A,B)) 是否有更好的方法来执行上述操作,以便我可以提取数组中的所有参数,如下所示 [x1,Y,n<X+Y] [x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n] [x1,Y(n),Z(n)^

以下是一些示例输入:

Fxfu(x1,Y,n<X+Y)

Fxfu(x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n)

Fxfu(x1,Y(n),Z(n)^M(n)<X+Y)

Fxfu(x1,(n,A,B),Z(n)^M(n)<T(n,A,B))
是否有更好的方法来执行上述操作,以便我可以提取数组中的所有参数,如下所示

[x1,Y,n<X+Y]
[x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n]
[x1,Y(n),Z(n)^M(n)<X+Y]
[x1,(n,A,B),Z(n)^M(n)<T(n,A,B)]

[x1,Y,n正则表达式不适合执行此任务,如注释中所述;但是,您可以通过计算括号在一次过程中轻松解决此问题:

def extract_args(expr):
    paren = 0
    start = 0
    ret = []
    for i, c in enumerate(expr):
        if c=='(':
            paren+=1
            if paren==1:
                start=i+1
        elif c==')':
            if paren==1 and start:
                ret.append(expr[start: i]) 
            paren-=1
        elif c==',' and paren==1:
            ret.append(expr[start:i])
            start=i+1
    return ret

你之前没有问过同样的问题吗?为什么你要写
[F][x][F][u]
而不是只写
Fxfu
?正则表达式通常不适合解析这样的递归模式。你需要使用递归下降解析器。你真的不需要一个完整的递归下降解析器,但正则表达式是一个不好的匹配项(呵呵)用于计算括号(更具体地说:“real”正则表达式无法完成此任务,句号、扩展正则表达式可以,但不适合此任务)您可以通过保持打开/关闭圆括号和逗号的计数来提取一次所需的部分。如果括号可以任意嵌套,则正则表达式不能帮助您。N个打开的括号后面跟着N个近旁的括号,这是回文的一种形式。如果输入的部分跳过,就不会有一对以上的PAR。每个术语(参数?函数调用?)@汤姆:在我之前的一次修改中,也就是现在的那次,也有类似的错误。
[x1,Y,n<X+Y]
[x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n]
[x1,Y(n),Z(n)^M(n)<X+Y]
[x1,(n,A,B),Z(n)^M(n)<T(n,A,B)]
def extract_args(expr):
    paren = 0
    start = 0
    ret = []
    for i, c in enumerate(expr):
        if c=='(':
            paren+=1
            if paren==1:
                start=i+1
        elif c==')':
            if paren==1 and start:
                ret.append(expr[start: i]) 
            paren-=1
        elif c==',' and paren==1:
            ret.append(expr[start:i])
            start=i+1
    return ret