如何创建正则表达式以匹配函数定义
我需要找到像这样的函数定义:
function (param1, param2, param3)
我在Python中使用了以下的正则表达式:
\S+\\((\S+|\s+|,)\\)
这样的话,像下面这样的内容:
re.findall("\S+\\((\S+|\s+|,)\\)",source_code_string)
应该能让我找到所有的函数名,但现在不行。请给我一些建议,帮我改进上面的正则表达式。我对正则表达式还很陌生。
3 个回答
你想要的内容不是很清楚,但可以考虑以下几点。
\w+
会匹配任何一个单词,这个单词可以包含字母、数字、下划线,以及大多数其他类似单词的字符。在处理Python的正则表达式时,使用原始字符串是比较好的选择,因为这样就不需要对反斜杠进行转义。这意味着你需要在每个正则表达式模式前加一个r,比如
r'this'
。否则,如果想要匹配一个字面上的反斜杠,你需要用\\\\
。如果不确定,可以查看 库文档,或者 其他关于正则表达式的资料。
你的正则表达式根本上是错的。
\S+\\((\S+|\s+|,)\\)
这段代码的意思是:至少要匹配一个非空格的字符,然后是一个括号,接着是一系列非空格字符,或者是一系列空格,或者是一个逗号,最后是一个闭合的括号。
我觉得你想要的是这个(使用原始字符串(r''),只需转义一次)
(\S+)\s*\(\s*\S+\s*(?:,\s*\S+)*\)
你可以在 这里的Regexr上查看
然后你可以在捕获组1中找到你函数的名字(因为第一个 \S+
被括号包围了)。
这里的 \s*
是可选的空格。
但是这个正则表达式太简单了,我敢肯定它不能找到所有的函数(它在嵌套括号时会失败),而且还会找到其他的东西。
这个答案要看源文件是用什么语言写的。记得在Python中,函数的定义是以def
开头,以:
结尾的。接着扩展一下Stema的回答,试试这个Python的写法:
^\s*def (\S+)\s*\(\s*\S+\s*(?:,\s*\S+)*\):$
这个表达式应该只会匹配Python的函数定义。^
和$
分别表示行的开头和结尾,所以这个表达式只会找到单独一行的函数定义,因为在Python中,函数定义通常都是单独一行的。