如何用正则提取方括号内函数并存储为字典?解决括号缺失问题
提取方括号内函数并存储到字典的解决方案
问题背景
你尝试从字符串里提取方括号内的所有函数并存储到字典,但当前代码输出除最后一个函数外,其余函数的右括号)都被剥离了。你的代码和错误输出如下:
原代码
import re line="[f(x,y),g(y,z),f1(x1,y1)]" matches = re.match(r"(.*)(\[)(.*)(\])(.*)", line) if matches: all_action_labels = matches.group(3) sep_action_labels = re.split(r'\),',all_action_labels) j=0 for x in sep_action_labels: print(f'Function #{j+1} : {x}')
错误输出
Function #1 : f(x,y Function #2 : g(y,z Function #3 : f1(x1,y1)
问题原因
你用re.split(r'\),', all_action_labels)拆分函数时,split会把匹配到的分隔符(也就是),)完全移除,所以前面的函数都丢失了右括号),只有最后一个函数因为末尾没有),,才保留了完整括号。
更简洁准确的解决方案
其实不用这么繁琐的拆分步骤,直接用re.findall匹配所有符合格式的函数就好,同时能轻松把结果存入字典。
修正后的代码
import re line = "[f(x,y),g(y,z),f1(x1,y1)]" # 匹配标准函数格式:函数名(字母/数字开头)+ 括号包裹的参数 functions = re.findall(r'\w+\(.*?\)', line) # 将函数存入字典,两种存储方式可选 func_dict = {} # 方式1:用序号作为键(不会有重名覆盖问题) for idx, func in enumerate(functions, start=1): func_dict[f"function_{idx}"] = func # 方式2:用函数名作为键(如果有重名函数,后面的会覆盖前面的,按需选择) # for func in functions: # func_name = re.match(r'(\w+)\(', func).group(1) # func_dict[func_name] = func # 打印验证结果 for key, value in func_dict.items(): print(f"{key}: {value}")
代码说明
正则匹配逻辑:
\w+\(.*?\)的含义:\w+:匹配1个以上的字母、数字或下划线,对应合法的函数名\(:转义匹配左括号((括号在正则里是特殊字符,必须转义).*?:非贪婪匹配任意字符,直到遇到第一个),确保只匹配单个函数的参数部分,不会跨函数匹配\):转义匹配右括号)
字典存储:
- 用
enumerate从1开始计数,把每个函数按序号存入字典,键如function_1、function_2,避免重名覆盖 - 如果想用函数名当键,注释里的代码可以实现,但要注意重名函数会被覆盖的问题
- 用
运行结果
function_1: f(x,y) function_2: g(y,z) function_3: f1(x1,y1)
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

