问题描述
我正在尝试将 python 脚本应用于某个C
文件,以便注释其中的一些定义。
我的目标是改变这个:
#define D_FOO
D_ADD_TEST(foo)
#define D_BAR
D_ADD_TEST(bar)
进入这个:
//#define D_FOO
//D_ADD_TEST(foo)
#define D_BAR
D_ADD_TEST(bar)
注释的定义存储在我的 python 脚本的列表中:
> cat myscript.py
#!/usr/bin/env python
var_bar = ['D_FOO']
[Insert the rest of the code here]
我可以尝试什么?
编辑:
结合@sKwa 的回答和一些反复试验,我得到了这个代码:
def comment_define(source, destination, tokens):
with open(source, 'r') as src, open(destination, 'w') as dst:
for line in src:
for token in tokens:
if "#define D_" + token.upper() in line or "#define\tD_" + token.upper() in line:
line = '//{}//{}'.format(line, next(src))
dst.write(line)
其中,当使用此输出运行( comment_define(foo.c, bar.c, tokens)
)时
#define D_ITOA
D_ADD_TEST(itoa);
#define D_STRTRIM
D_ADD_TEST(strtrim);
#define D_LSTNEW
D_ADD_TEST(lstnew);
#define D_LSTDELONE
D_ADD_TEST(lstdelone);
#define D_LSTDEL
D_ADD_TEST(lstdel);
#define D_LSTADD
D_ADD_TEST(lstadd);
#define D_LSTITER
D_ADD_TEST(lstiter);
#define D_LSTMAP
D_ADD_TEST(lstmap);
tokens = ['lstnew', 'lstdelone', 'lstdel', 'lstadd', 'lstiter', 'lstmap']
输出:
//#define D_LSTNEW
// D_ADD_TEST(lstnew);
////#define D_LSTDELONE
// D_ADD_TEST(lstdelone);
//#define D_LSTDEL
D_ADD_TEST(lstdel);
//#define D_LSTADD
// D_ADD_TEST(lstadd);
//#define D_LSTITER
// D_ADD_TEST(lstiter);
//#define D_LSTMAP
// D_ADD_TEST(lstmap);
为什么有些评论两次? 为什么完全没有评论?
1楼
如果你试试这个怎么办?
#!/usr/bin/env python3
import re
TKNS=['lstnew', 'lstdelone', 'lstdel', 'lstadd', 'lstiter', 'lstmap']
SRC='test.c'
DST='testbis.c'
def comment_define(source, destination, tokens):
with open(source, 'r') as src, open(destination, 'w') as dst:
for line in src:
for token in tokens:
if re.match('#define\s+D_%s' % token.upper(), line):
line = '//{}//{}'.format(line, next(src))
break
dst.write(line)
if __name__ == '__main__':
comment_define(SRC, DST, TKNS)
这是基于@sKwa 的回答,但他在我建议添加break
之前将其删除(因此可能对同一行进行两次评论)。
我用一些正则表达式匹配替换了in
运算符。