Python 提取括号之间的字符串内容->;例如:函数名((param1),(param2))应该给出(param1),(param2)

Python 提取括号之间的字符串内容->;例如:函数名((param1),(param2))应该给出(param1),(param2),python,regex,string,Python,Regex,String,我想得到函数fun5中的整个字符串。例如: 1.) fun5(hello union fun1(param1) union fun2(param2)) union fun3(param3) union fun4(param4) 应返回->hello union fun1(param1)union fun2(param2) 应返回->hello union fun1(param1)union fun2(param2) 我尝试使用以下regexp: import re str = "fun5(he

我想得到函数fun5中的整个字符串。例如:

1.) fun5(hello union fun1(param1) union fun2(param2)) union fun3(param3) union fun4(param4)
应返回->
hello union fun1(param1)union fun2(param2)

应返回->
hello union fun1(param1)union fun2(param2)

我尝试使用以下regexp:

import re
str = "fun5(hello union fun1(param1) union fun2(param2)) union fun3(param3) union fun4(param4)"

if re.search(r'(:?\W|^)(:?fun5)\(', str, re.IGNORECASE):
    exp = re.search(fun5\((.*?)\)', str, re.IGNORECASE).group(1)
    print(exp)

但是由于里面嵌套了括号,所以它不起作用。

这个如何
*fun5\(.*\(.*\)\)
这个如何
*fun5\(.*\(.*)\)\)
如果你知道括号不会比某个有限数更深(在你的例子中是2),那么编写正则表达式是可能的,但很棘手。这是因为正则表达式不是为处理嵌套模式而设计的。一些正则表达式引擎有扩展,允许模式的任意嵌套,或者专门匹配嵌套括号中的文本,但Python没有

因此,如果您可能需要处理任意嵌套深度,您可以使用非正则表达式解决方案,如下面的解决方案。在这里,我们找到第一个左括号,然后逐个字符扫描。每次我们找到一个圆括号,我们就增加深度。每次我们找到一个右括号时,我们都会减小深度并检查是否处于0级。如果是,则找到了与左括号匹配的右括号,并返回结果

def deparen(text):
    start = text.find("(")
    if start < 0:
        raise ValueError("no opening parenthesis")
    depth = 0
    for i in range(start, len(text)):
        if text[i] == "(":
            depth += 1
        elif text[i] == ")":
            depth -= 1
            if not depth:
                return text[start+1:i]
    raise ValueError("too few closing parentheses")
deparen定义(文本):
开始=文本。查找(“”)
如果开始<0:
raise VALUERROR(“无左括号”)
深度=0
对于范围内的i(开始,len(文本)):
如果文本[i]==“(”:
深度+=1
elif文本[i]==”):
深度-=1
如果不是深度:
返回文本[开始+1:i]
raise VALUERROR(“结束括号太少”)

请注意,这不处理带引号的括号。例如,如果文本中可能有带引号的字符串,则这些字符串可能包含开头和/或结尾括号,而这些括号不应计入嵌套中。处理这一问题的关键是检测带引号的字符并跳过引号内的任何字符。但是引号可能会被转义,因此也必须检测到这一点……在某种程度上,使用实际的解析器变得更容易。

如果知道括号不会比某个有限数更深(在您的示例中为2),那么编写正则表达式是可能的,但很棘手。这是因为正则表达式根本不是为处理嵌套模式而设计的。一些正则表达式引擎具有允许模式任意嵌套的扩展,或者专门用于匹配嵌套括号中的文本,但Python没有

因此,如果您可能需要处理任意嵌套深度,您可以使用下面的非正则表达式解决方案。在这里,我们找到第一个左括号,然后逐个字符扫描。每次找到左括号,我们都会增加深度。每次找到右括号,我们都会减少深度并检查到s如果我们在0级,请参阅。如果我们在0级,则找到了与左括号匹配的右括号,然后返回结果

def deparen(text):
    start = text.find("(")
    if start < 0:
        raise ValueError("no opening parenthesis")
    depth = 0
    for i in range(start, len(text)):
        if text[i] == "(":
            depth += 1
        elif text[i] == ")":
            depth -= 1
            if not depth:
                return text[start+1:i]
    raise ValueError("too few closing parentheses")
deparen定义(文本):
开始=文本。查找(“”)
如果开始<0:
raise VALUERROR(“无左括号”)
深度=0
对于范围内的i(开始,len(文本)):
如果文本[i]==“(”:
深度+=1
elif文本[i]==”):
深度-=1
如果不是深度:
返回文本[开始+1:i]
raise VALUERROR(“结束括号太少”)
请注意,这不处理带引号的括号。例如,如果文本中可能有带引号的字符串,则这些字符串可能包含开头和/或结尾括号,而这些括号不应计入嵌套中。处理这一问题的关键是检测带引号的字符并跳过引号内的任何字符。但是引号可能会被转义,因此也必须检测到这一点…在某种程度上,使用实际的解析器会变得更容易。

(?=\()(?:(?=*?)(?!*?\2)(*)(?!*\3)。*)(?=*)(?!*)(?!*\3)(*)+?*(?=\2)[^(]*(?=\3$)
其中组1包含包含在paren中的函数参数。例如,
(hello union fun1(param1)union fun2(
)((?=\()(?:(?=**?\(?!*?\2)(*)(?!*\3.*)(?=*)(?!*\3)(*)+?*(?=\2)[^(]*(?=\3$)
,其中组1包含包含在paren中的函数参数。即
(hello union fun1(param1)union fun2(param2))