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

时间:2018-12-05 20:54:59

标签: 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)

2.) fun3(param3) union fun4(param4) union fun5(hello union fun1(param1) union fun2(param2))

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

我尝试使用下面的正则表达式:

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)

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

2 个答案:

答案 0 :(得分:3)

如果您知道括号的深度不超过某个有限数字(在示例中为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")

请注意,这不处理带引号的括号。例如,如果文本中可能包含带引号的字符串,则这些字符串可能包含左括号和/或右括号,在嵌套中不应计入。处理此问题的关键是检测引号字符并跳过引号内的所有字符。但是引号可能会被转义,因此您也必须检测到它……在某些时候,使用实际的解析器会变得更加容易。

答案 1 :(得分:0)

这个.*fun5\((.*\(.*\))\)