如何用Python 2.7内置函数提取字符串格式Python函数的入参
解决方案
正则失效原因
你最初的正则返回None主要有两个问题:
re.match()要求从字符串开头完成匹配,而你的输入字符串开头是函数名,并非参数部分,自然匹配失败- 正则本身的语法和匹配逻辑存在缺陷,既没有处理函数名前缀,也没有覆盖非字符串类型的参数(比如示例中的布尔值
False)
实现方案
方案1:正则实现(推荐,兼容性好)
Python 2.7内置的re模块完全可以满足需求,代码如下:
import re def extract_call_args(func_str): # 第一步截取括号内部的参数字符串 args_part = func_str[func_str.find('(') + 1 : func_str.rfind(')')] # 匹配两种参数:带双引号的字符串、不带引号的常量(布尔、数字等) pattern = re.compile(r'"([^"]+)"|(\w+)') match_res = pattern.findall(args_part) # 处理匹配结果,每组仅一个分组有有效值 return [item[0] if item[0] else item[1] for item in match_res]
测试验证
# 测试用例 test_cases = [ 'create.copy("Node_A", "Information", False)', 'create.new("Node_B")', 'delete("Node_C")' ] for case in test_cases: print extract_call_args(case)
输出结果完全符合预期:
["Node_A", "Information", "False"] ["Node_B"] ["Node_C"]
方案2:纯字符串处理(无需依赖正则)
如果不想使用正则,仅用基础字符串操作也可以实现,适配你给出的所有场景:
def extract_call_args_no_re(func_str): # 提取括号内的参数部分 args_content = func_str[func_str.index('(') + 1 : func_str.rindex(')')] args_list = args_content.split(',') res = [] for arg in args_list: arg = arg.strip() # 去除参数两端的双引号 if arg.startswith('"') and arg.endswith('"'): arg = arg[1:-1] res.append(arg) return res
该方案适用于参数中不包含嵌套引号、逗号的场景,你给出的示例均满足该条件。
内容的提问来源于stack exchange,提问作者Websterek
相关产品推荐
相关产品推荐

