使用Python Regex在File中查找C函数

我试图让Python正则表达式搜索.c文件并获取其中的函数。

例如:

int blahblah( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { ... 

我想把blahblah作为功​​能。

这个正则表达式对我不起作用,它一直给我Noner"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{"

(?<=(int\s)|(void\s)|(string\s)|(double\s)|(float\s)|(char\s)).*?(?=\s?\()

http://regexr.com?3332t

这应该适合你想要的。 只需继续添加您需要捕获的类型。

re.findall(r'(?<=(?<=int\s)|(?<=void\s)|(?<=string\s)|(?<=double\s)|(?<=float\s‌​)|(?<=char\s)).*?(?=\s?\()', string)适用于python。

由于参数中的括号(特别是__attribute__((unused))中的括号,正则表达式没有捕获它。 您可能能够为这种情况调整正则表达式,但一般来说,正则表达式无法解析像C这样的语言。您可能希望使用像pycparser这样的完整解析器。

正则表达式不是从源代码文件中提取某些语义信息的适当工具(尽管它们有利于语法高亮 – 因为语法通常通过正则表达式表达)。 Regexp无法处理嵌套构造,跟踪正在发生的事情,distingiush类型和符号。

我推荐一些真正了解语言结构的专用工具,比如ctagspython-pygccxml

ctags是一个程序,它可以生成C源中的实体列表及其位置(用于帮助在文本编辑器(如viemacs )中通过C代码库进行导航)。 python-pygccxml是一个Python库绑定到C库libgccxml ,它使用gcc内部来分析代码并生成有关程序语义的丰富和结构化输出。