所以我有一个变量包含来自某个文件的所有代码。我需要删除此文件中的所有注释。我的正则线之一就是这个
x=re.sub('\/\*.*\*\/','',x,re.M,re.S);
我希望这样做是删除所有多行注释。但是出于一些奇怪的原因,它跳过了两个* /的实例,并将所有内容删除到* /的第三个实例。
我很确定原因是* /之后的第三个实例有代码,而前两个实例就是它们。我不确定为什么这很重要,但我很确定这就是原因。
有什么想法吗?
答案 0 :(得分:4)
.*
将始终匹配尽可能多的字符。尝试(.*?)
- 大多数实现应尽量匹配尽可能少的字符(应该没有括号但现在不确定)。因此,您的整个模式应如下所示:\/\*.*?\*\/
或\/\*(.*?)\*\/
答案 1 :(得分:1)
表达式.*
是贪婪的,这意味着它将尝试匹配尽可能多的字符。相反,请使用(.*?)
,这将尽快停止匹配字符。
答案 2 :(得分:1)
正则表达式是“贪婪的”,当出现几个停止点时将采取最远的一个。正则表达式有一些模式可以帮助控制它,特别是
(?& gt!...)
仅当它不在parens中匹配模式时才匹配以下表达式。 (在上面添加一个尖括号的& gt - 我不知道在我的答案中获得的论坛惯例。)
(?* ...)不在Python 2.4中,但如果您使用的是更高版本,则是一个不错的选择。