如何用正则表达式拆分含嵌套函数的拼接函数调用字符串?
拆分含嵌套函数调用的拼接字符串
你的问题出在原正则用了非贪婪匹配.*?,它会在遇到第一个右括号)时就停止匹配,没法处理函数参数里嵌套的子函数(比如c(1,2,3)这种)。
要完整匹配包含嵌套函数的调用,需要用支持平衡括号匹配的正则表达式。Python 3.10及以上版本的标准re库支持递归语法,可以直接实现:
解决方案代码
import re # 包含嵌套函数的目标字符串 s = "hello(data=x, capitalize = True)there()my(x = x)dear(x, 6L, ...)friend(x = c(1, 2, 3))another(y = list(a=1, b=c(2,3)))" # 匹配含嵌套的函数调用正则 pattern = r'\w+\((?:[^()]|(?R))*\)' result = re.findall(pattern, s) print(result)
输出结果
['hello(data=x, capitalize = True)', 'there()', 'my(x = x)', 'dear(x, 6L, ...)', 'friend(x = c(1, 2, 3))', 'another(y = list(a=1, b=c(2,3)))']
正则说明
\w+:匹配函数名(由字母、数字、下划线组成)\(:匹配函数的左括号(?:[^()]|(?R))*:非捕获组,负责匹配括号内的内容:[^()]:匹配不是括号的普通字符(?R):递归匹配整个正则模式,也就是处理嵌套的函数调用(比如子函数里的c(1,2,3))
\):匹配函数的右括号
兼容旧Python版本(3.10以下)
如果你的Python版本低于3.10,标准re库不支持(?R)递归语法,可以使用第三方库regex(功能更强大的正则库):
- 先安装库:
pip install regex
- 使用代码:
import regex s = "hello(data=x, capitalize = True)there()my(x = x)dear(x, 6L, ...)friend(x = c(1, 2, 3))" result = regex.findall(r'\w+\((?:[^()]|(?R))*\)', s) print(result)
内容的提问来源于stack exchange,提问作者O Renée
相关产品推荐
相关产品推荐

