Python自定义文档生成器:正则匹配函数参数不全问题求助
Python函数参数正则匹配问题解答
嘿,我来给你把这个问题掰明白!你遇到的情况其实是正则里重复捕获组的覆盖特性在搞鬼,咱们一步步拆解:
问题根源:重复捕获组只会保留最后一次匹配结果
你写的正则def (.+)\((?:(\w+),)*(\w+)\)里,(?:(\w+),)*这个部分是一个非捕获组包裹着捕获组,重复匹配“参数名+逗号”的结构。但这里的坑点在于:每次重复匹配时,内部的捕获组(\w+)都会覆盖之前的捕获结果。
举个例子,匹配arg1,arg2,的时候:
- 第一次匹配:捕获组拿到
arg1 - 第二次匹配:捕获组会把
arg1替换成arg2
等这个非捕获组匹配完,里面的捕获组就只剩最后一次的结果arg2了,再加上后面(\w+)捕获的arg3,最终就只能拿到arg2和arg3,前面的arg1直接被覆盖丢了。
另外,你的函数名匹配用(.+)也不太严谨,它会匹配任何字符(包括空格、特殊符号),换成\w+更适合匹配Python函数名。
靠谱的解决方案
其实正则处理重复捕获本来就不是强项,咱们换个思路更稳妥:
方案1:先匹配整体,再拆分参数(推荐)
先捕获函数名和完整的参数字符串,再用字符串拆分的方式提取参数,代码更清晰也不容易出错:
import re # 正则匹配函数名和整个参数字段 pattern = r'def (\w+)\((.*?)\):' text = 'def my_function(arg1,arg2,arg3): """ DOC """' match_result = re.search(pattern, text) if match_result: func_name = match_result.group(1) args_string = match_result.group(2) # 拆分参数,处理无参数的情况 args_list = args_string.split(',') if args_string else [] print(f"函数名:{func_name}") print(f"参数列表:{args_list}")
方案2:用正则一次性捕获(适合Python 3.8+)
如果一定要用正则的方式,也可以先捕获完整的参数字符串,再内部处理,比如:
import re pattern = r'def (\w+)\((?P<args>(?:\w+,)*\w+)?\):' text = 'def my_function(arg1,arg2,arg3): """ DOC """' match_result = re.search(pattern, text) if match_result: func_name = match_result.group(1) args_string = match_result.group('args') args_list = args_string.split(',') if args_string else [] print(f"函数名:{func_name}") print(f"参数列表:{args_list}")
本质还是拆分字符串,但正则结构更清晰,也能处理无参数的函数(比如def my_func():)。
内容的提问来源于stack exchange,提问作者Thomas Kowalski
相关产品推荐
相关产品推荐

