如何编写Regex Pattern提取Python函数声明括号内的参数内容
Python函数参数提取方案
正则匹配方案
适合参数结构简单、无嵌套括号/参数内逗号的场景,直接使用以下正则捕获即可:
核心正则:r'def\s+\w+\((.*?)\)\s*:'
捕获组1即为括号内的完整参数字符串,示例代码如下:
import re def get_param_str(def_line: str): res = re.match(r'def\s+\w+\((.*?)\)\s*:', def_line.strip()) return res.group(1) if res else None # 测试示例 test_line = "def func(int_var:int,float_var=12.1,string_var=foo()):" param_str = get_param_str(test_line) print(param_str) # 输出:int_var:int,float_var=12.1,string_var=foo() # 简单场景下直接按逗号拆分即可得到参数列表
注意:如果参数默认值包含嵌套括号、参数内带逗号(比如默认值为元组/函数调用带参数),正则会匹配出错,推荐使用下方的ast解析方案。
通用ast解析方案
利用Python自带的语法解析模块处理,完全贴合Python语法规则,不管参数结构多复杂都能正确识别,无需手动处理边界情况:
import ast def extract_param_list(def_line: str) -> list: # 补全pass让单行函数定义可以被正常解析成语法树 ast_tree = ast.parse(def_line + "pass") func_node = ast_tree.body[0] param_list = [] arg_count = len(func_node.args.args) default_count = len(func_node.args.defaults) for idx, arg in enumerate(func_node.args.args): # 拼接参数名+类型标注(如果有) current_param = arg.arg if arg.annotation: current_param += f":{ast.unparse(arg.annotation)}" # 拼接默认值(如果有) if idx >= arg_count - default_count: default_val = func_node.args.defaults[idx - (arg_count - default_count)] current_param += f"={ast.unparse(default_val)}" param_list.append(current_param) return param_list # 测试示例 test_line = "def func(int_var:int,float_var=12.1,string_var=foo()):" print(extract_param_list(test_line)) # 输出:['int_var:int', 'float_var=12.1', 'string_var=foo()']
内容的提问来源于stack exchange,提问作者Xavier C
相关产品推荐
相关产品推荐

