如何用Python正则表达式提取函数名?新手技术求助
提取Python函数名的正则解决方案
嘿,我来帮你搞定这个提取函数名的问题!你原来的代码没成功,核心原因是正则表达式没专门捕获函数名的部分,反而把def、括号这些无关内容都匹配进去了,自然拿不到想要的结果。
问题分析
你写的正则r"\s*(def)\s+\([^\)]*\)\s*{?\s*",其实是在匹配从def开始到括号结束的整段内容,但完全没对中间的函数名做捕获,所以返回的都是包含def的片段,不是单独的函数名。
正确的实现方法
我们需要调整正则,用捕获组把函数名单独拎出来。Python的函数名规则是:必须以字母或下划线开头,后面可以跟字母、数字、下划线。结合这个规则,我们可以写出精准的正则:
import re def extractName(s): function_names = [] # 正则解释:匹配def开头,捕获符合命名规则的函数名,后面跟左括号 regexp = re.compile(r'\s*def\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(') for m in regexp.finditer(s): # group(1)就是捕获到的函数名,group(0)是整个匹配的字符串 function_names.append(m.group(1)) return function_names
测试验证
比如用你给的测试字符串:
test_str = "def myFunction(s): ...." print(extractName(test_str)) # 输出: ['myFunction']
如果有多个函数定义,比如:
test_str = """ def func_one(): pass def func_two(a, b): return a + b """ print(extractName(test_str)) # 输出: ['func_one', 'func_two']
额外说明
- 这个正则会忽略
def前后的空格,适配不同的代码格式 - 严格遵循Python函数命名规则,不会匹配不符合规范的名称
- 如果你的代码里有嵌套函数、装饰器之类的复杂情况,可能需要进一步调整正则,但对于基础的函数定义完全够用
内容的提问来源于stack exchange,提问作者Flowerwhite
相关产品推荐
相关产品推荐

