在python中使用reg exps的小问题

时间:2010-12-10 00:13:19

标签: python regex

所以我有一个变量包含来自某个文件的所有代码。我需要删除此文件中的所有注释。我的正则线之一就是这个

x=re.sub('\/\*.*\*\/','',x,re.M,re.S);

我希望这样做是删除所有多行注释。但是出于一些奇怪的原因,它跳过了两个* /的实例,并将所有内容删除到* /的第三个实例。

我很确定原因是* /之后的第三个实例有代码,而前两个实例就是它们。我不确定为什么这很重要,但我很确定这就是原因。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

.*将始终匹配尽可能多的字符。尝试(.*?) - 大多数实现应尽量匹配尽可能少的字符(应该没有括号但现在不确定)。因此,您的整个模式应如下所示:\/\*.*?\*\/\/\*(.*?)\*\/

答案 1 :(得分:1)

表达式.*是贪婪的,这意味着它将尝试匹配尽可能多的字符。相反,请使用(.*?),这将尽快停止匹配字符。

答案 2 :(得分:1)

正则表达式是“贪婪的”,当出现几个停止点时将采取最远的一个。正则表达式有一些模式可以帮助控制它,特别是

  

(?& gt!...)

仅当它不在parens中匹配模式时才匹配以下表达式。 (在上面添加一个尖括号的& gt - 我不知道在我的答案中获得的论坛惯例。)

(?* ...)不在Python 2.4中,但如果您使用的是更高版本,则是一个不错的选择。