python中的正则表达式

时间:2011-03-22 18:26:43

标签: python regex string

我发现在python中很难理解正则表达式。文档太神秘了。例如,删除#if DEBUG的所有实例以及它与C文件中对应的#endif之间的所有内容的重要性。以下是行不通的:

 buf = file.read()
 a = re.compile("#if.DEBUG?#endif", re.MULTILINE + re.DOTALL)  
 string1 = re.sub(p_macro, '', buf) 

3 个答案:

答案 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正则表达式调试器,您可以更轻松地制作和测试正则表达式。