我正在尝试使用 Python 正则表达式来搜索 .c 文件并获取其中的函数。
例如:
int blahblah(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
...
我想得到blahblah
作为功能。
这个正则表达式对我不起作用,它不断给我None
:r"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{"
由于参数中的括号(特别是 中的括号__attribute__((unused))
),正则表达式没有捕捉到它。您可能可以针对这种情况调整正则表达式,但一般来说,正则表达式无法解析像 C 这样的语言。您可能想要使用像pycparser这样的成熟解析器。
(?<=(int\s)|(void\s)|(string\s)|(double\s)|(float\s)|(char\s)).*?(?=\s?\()
这应该适用于您想要的。只需继续添加您需要捕获的类型。
re.findall(r'(?<=(?<=int\s)|(?<=void\s)|(?<=string\s)|(?<=double\s)|(?<=float\s)|(?<=char\s)).*?(?=\s?\()', string)
将适用于python。
正则表达式不是从源代码文件中提取一些语义信息的合适工具(尽管它们有利于语法高亮——因为语法通常通过正则表达式表达)。正则表达式无法处理嵌套结构、跟踪正在发生的事情、区分类型和符号。
我会推荐一些真正了解语言结构的专用工具,例如ctags
or python-pygccxml
。
ctags
是一个程序,它在 C 源代码中生成实体列表及其位置(用于帮助在文本编辑器中导航 C 代码库,如vi
和emacs
)。python-pygccxml
是一个与 C 库的 Python 绑定,libgccxml
它使用 gcc 内部来分析代码并产生关于程序语义的丰富和结构化的输出。