如何创建正则表达式以匹配函数定义

0 投票
3 回答
5242 浏览
提问于 2025-04-17 02:37

我需要找到像这样的函数定义:

function (param1, param2, param3)

我在Python中使用了以下的正则表达式:

\S+\\((\S+|\s+|,)\\)

这样的话,像下面这样的内容:

re.findall("\S+\\((\S+|\s+|,)\\)",source_code_string)

应该能让我找到所有的函数名,但现在不行。请给我一些建议,帮我改进上面的正则表达式。我对正则表达式还很陌生。

3 个回答

1

你想要的内容不是很清楚,但可以考虑以下几点。

  • \w+ 会匹配任何一个单词,这个单词可以包含字母、数字、下划线,以及大多数其他类似单词的字符。

  • 在处理Python的正则表达式时,使用原始字符串是比较好的选择,因为这样就不需要对反斜杠进行转义。这意味着你需要在每个正则表达式模式前加一个r,比如 r'this'。否则,如果想要匹配一个字面上的反斜杠,你需要用 \\\\

  • 如果不确定,可以查看 库文档,或者 其他关于正则表达式的资料

2

你的正则表达式根本上是错的。

\S+\\((\S+|\s+|,)\\)

这段代码的意思是:至少要匹配一个非空格的字符,然后是一个括号,接着是一系列非空格字符,或者是一系列空格,或者是一个逗号,最后是一个闭合的括号。

我觉得你想要的是这个(使用原始字符串(r''),只需转义一次)

(\S+)\s*\(\s*\S+\s*(?:,\s*\S+)*\)

你可以在 这里的Regexr上查看

然后你可以在捕获组1中找到你函数的名字(因为第一个 \S+ 被括号包围了)。

这里的 \s* 是可选的空格。

但是这个正则表达式太简单了,我敢肯定它不能找到所有的函数(它在嵌套括号时会失败),而且还会找到其他的东西。

2

这个答案要看源文件是用什么语言写的。记得在Python中,函数的定义是以def开头,以:结尾的。接着扩展一下Stema的回答,试试这个Python的写法:

^\s*def (\S+)\s*\(\s*\S+\s*(?:,\s*\S+)*\):$

这个表达式应该只会匹配Python的函数定义。^$分别表示行的开头和结尾,所以这个表达式只会找到单独一行的函数定义,因为在Python中,函数定义通常都是单独一行的。

撰写回答