使用Python Regex在File中查找C函数
我试图让Python正则表达式搜索.c文件并获取其中的函数。
例如:
int blahblah( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { ...
我想把blahblah
作为功能。
这个正则表达式对我不起作用,它一直给我None
: r"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{"
(?<=(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。
由于参数中的括号(特别是__attribute__((unused))
中的括号,正则表达式没有捕获它。 您可能能够为这种情况调整正则表达式,但一般来说,正则表达式无法解析像C这样的语言。您可能希望使用像pycparser这样的完整解析器。
正则表达式不是从源代码文件中提取某些语义信息的适当工具(尽管它们有利于语法高亮 – 因为语法通常通过正则表达式表达)。 Regexp无法处理嵌套构造,跟踪正在发生的事情,distingiush类型和符号。
我推荐一些真正了解语言结构的专用工具,比如ctags
或python-pygccxml
。
ctags
是一个程序,它可以生成C源中的实体列表及其位置(用于帮助在文本编辑器(如vi
和emacs
)中通过C代码库进行导航)。 python-pygccxml
是一个Python库绑定到C库libgccxml
,它使用gcc内部来分析代码并生成有关程序语义的丰富和结构化输出。