我发现在python中很难理解正则表达式。文档太神秘了。例如,删除#if DEBUG
的所有实例以及它与C文件中对应的#endif
之间的所有内容的重要性。以下是行不通的:
buf = file.read()
a = re.compile("#if.DEBUG?#endif", re.MULTILINE + re.DOTALL)
string1 = re.sub(p_macro, '', buf)
答案 0 :(得分:3)
如果要删除#if DEBUG的所有实例,您只需要将DEBUG定义为0,然后在其上运行预处理器。不需要讨厌的正则表达式。
此外,使用正则表达式操作无上下文语法(例如C源,或者更为出名的是html)通常不是一个好主意。使用解析库。查看eclipse sdk,例如:http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/overview-summary.html
答案 1 :(得分:1)
Python的RegEx使用PCRE的大部分语法。您可以从http://www.regular-expressions.info/tutorial.html了解其中一些内容。
您的代码无效,因为
#if.DEBUG?#endif
// ^^
G?
实际上意味着“一个或零G
个字符”。
如果要删除整个#if DEBUG
块,请尝试
re.compile(
r'^\s*#if\s+DEBUG' # match the '#if DEBUG' preprocessor.
r'.*?' # match all content in between until...
r'^\s*#endif' # ... getting a '#endif' and match it
,
re.S|re.M
)
但它不适用于嵌套的#if
块,也不会检查预处理器是否在注释/* ... */
内。最好使用CPP解析器来保证正确性。
答案 2 :(得分:0)
如果您的开发平台上有Kodos, Python正则表达式调试器,您可以更轻松地制作和测试正则表达式。