使用Regex python

时间:2018-04-26 15:40:14

标签: python regex

我正在尝试使用REGEX提取文件中的所有函数。 这是一个标准文件示例:

int main()
{
    printf("hello to all the good people");
    printf("hello to all the good people %d ", GetLastError());

    for(int i =0; i<15; i++)
    {
        if(i == 5)
        {
            switch(i)
            {
                case 0:
                    break; 
            }
        }
    }
}

与此同时,我只使用以下REGEX成功捕获函数:

regex = re.findall('\w+\s*?[(].*[)]', _content) #'\w+\s*?[(]*[)]'
for i in regex:
    print i

我的问题是:

  1. 我怎么能告诉他忽略FOR或SWITCH之类的东西?
  2. 如何告诉他在外部找到内部函数作为示例:
  3. printf ("%s", get_string());

    1. 如何使其与引号之间的()不相关而不是引号之间的()(如果我有行: printf("hello to j. (and rona) %s", get_family_name()); 他会知道提取:

      foo name: parameters: printf "hello to j. (and rona) %s", get_family_name() get_family_name none

1 个答案:

答案 0 :(得分:1)

您无法使用正则表达式解析C.

还有另一个question用于使用正则表达式解析HTML;这里给出的答案也适用于C,基本上也适用于任何有用的编程语言。

pycparser库看起来可能有用,尤其是func_calls example - 事实上,我认为以下代码段(根据该示例改编)将完全符合您的要求,尽管我还没有'测试了它:

from pycparser import c_ast, parse_file

class FuncCallVisitor(c_ast.NodeVisitor):
    def visit_FuncCall(self, node):
        print("{} called at {}".format(node.name.name, node.name.coord))

ast = parse_file("myfile.c", use_cpp=True)
v = FuncCallVisitor()
v.visit(ast)