3

我正在尝试使用 Python 正则表达式来搜索 .c 文件并获取其中的函数。

例如:

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

我想得到blahblah作为功能。

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

4

3 回答 3

3

由于参数中的括号(特别是 中的括号__attribute__((unused))),正则表达式没有捕捉到它。您可能可以针对这种情况调整正则表达式,但一般来说,正则表达式无法解析像 C 这样的语言。您可能想要使用像pycparser这样的成熟解析器。

于 2012-12-08T21:09:55.907 回答
3

(?<=(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。

于 2012-12-09T11:57:05.027 回答
0

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

我会推荐一些真正了解语言结构的专用工具,例如ctagsor python-pygccxml

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

于 2012-12-08T21:59:19.363 回答