读取并用Python替换C#ifndef /#endif外壳

时间:2018-08-20 07:59:03

标签: python parsing

我想在一个大型项目中用#pragma once替换旧的包含保护宏。

#ifndef FOO_H
#define FOO_H

class foo
{
};

#endif

我想知道,替换#ifndef #define #endif块的可靠策略是什么?正则表达式仍然适合于此吗?我觉得在模板头文件和类似内容的情况下,解析标头的顶部(对于#define和底部(对于#endif)可能容易出错。

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式

import re

s = '''
#ifndef FOO_H
#define FOO_H

class foo
{
  // ensure regex is greedy
#ifndef A
#define A
#endif
};

#endif'''

regexpr = re.compile(r'#ifndef [A-Za-z_]+\s+#define [A-Za-z_]+\s+(.*)\s+#endif',
                   re.DOTALL)

newf = '#pragma once\n\n{}'.format(regexpr.search(s).group(1))

输出

#pragma once

class foo
{
  // ensure regex is greedy
#ifndef A
#define A
#endif
};