我想获取在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)
但是由于里面有嵌套的括号,所以它不起作用。
答案 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\((.*\(.*\))\)