【发布时间】:2011-01-20 02:43:25
【问题描述】:
我正在编写一个程序来自动编写一些 C 代码,(我正在编写将字符串解析为具有相同名称的枚举) C 对字符串的处理不是很好。 所以一直有人唠叨我要试试python。
我创建了一个应该删除 C 风格 /* COMMENT */ 和 //COMMENT 的函数
从一个字符串:
代码如下:
def removeComments(string):
re.sub(re.compile("/\*.*?\*/",re.DOTALL ) ,"" ,string) # remove all occurance streamed comments (/*COMMENT */) from string
re.sub(re.compile("//.*?\n" ) ,"" ,string) # remove all occurance singleline comments (//COMMENT\n ) from string
所以我尝试了这段代码。
str="/* spam * spam */ eggs"
removeComments(str)
print str
它显然什么也没做。
关于我做错了什么有什么建议吗?
有句话我听过几次:
如果您遇到问题并尝试使用正则表达式解决它,您最终会遇到两个问题。
编辑: 多年以后再回首。 (经过相当多的解析经验)
我认为正则表达式可能是正确的解决方案。
这里使用的简单正则表达式“足够好”。
我在问题中可能没有足够强调这一点。
这是针对单个特定文件的。这没有棘手的情况。
我认为让正则表达式解析的文件足够简单,而不是将正则表达式复杂化为不可读的符号汤,维护工作会少得多。 (例如,要求文件仅使用 // 单行 cmets。)
【问题讨论】:
-
只有一个合理的回复:kore-nordmann.de/blog/do_NOT_parse_using_regexp.html。他说的是另一种语言,但他的结论仍然有效。
-
@Jerry - 严格来说,您通常可以猜测出合理的嵌套限制,并定义语言的常规近似值。无论如何,许多编译器都有注释嵌套限制。但是 - 什么限制是安全的?另外,我不想调试正则表达式。无论哪种方式都很好。
-
@Steve314:您可以猜测一个合理的嵌套限制(例如,在 C 中,cmets 根本不嵌套),但这并没有什么好处。举一个明显的例子,字符串文字中的注释定界符不算数,但跨行的注释定界符(字符之间有反斜杠)确实计数。在 RE 中正确考虑其中任何一个都不是微不足道的。
-
你上面的一些正则表达式救了我的命;)
-
@JerryCoffin 其实合理的回复应该是stackoverflow.com/a/1732454/321973