Python 3正则表达式查找多行注释

3

我正在尝试使用Python 3中的正则表达式在PHP源代码中查找注释块。 PHP注释的格式如下:

/**
 * This is a very short block comment
 */

现在我想到了下面的正则表达式:
'/\*\*[.]+?\*/'

我想结合DOTALL标志使用应该可以解决问题,但事实并非如此。它什么都找不到。奇怪的是当我去掉末尾的斜杠时,像这样:

'/\*\*[.]+?\*'

然后它会找到以下字符串:
/**\n\t*

我不知道为什么正则表达式无法找到一个星号后跟着一个斜杠... 我检查了我要搜索的文件,以确保我在注释中没有拼写错误(我没有)。 此外,斜杠在正则表达式中不是特殊字符,所以我不需要转义它。(我尝试过,但没有帮助。)
有人能告诉我我的正则表达式有什么问题吗? :)
顺便说一下,我还遇到了这个!线程,在那里有人试图在Java中做同样的事情。最终获胜的答案以与我现在相同的方式结束了他的正则表达式,所以我很困惑:( 这可能是Python regex中的一个错误,或者我完全没有理解?
非常感谢任何帮助! :D

你的模式中为什么要使用 [.]?而不是只用 .+ - arunkumar
嗯,因为一开始我使用了[.\s]而没有使用DOTALL标志。在我删除\s并添加DOTALL标志后,方括号仍然存在。但是,现在我将它们删除后,它们似乎引起了问题。如果有人能解释一下吗?就我对正则表达式的了解而言,'.+'应该与[.]+匹配相同的内容,对吧? - lunanoko
2个回答

5
您可以使用re.DOTALL标志使.字符匹配换行符:
re.compile(r'/\*\*.+?\*/', re.DOTALL)

(顺便提一下,PHP的块注释可以以/*开始,而不仅仅是/**。)

我的错,我忘记在我的帖子中包含“DOTALL”标志了。但是我在程序中已经这样做了,但它似乎不起作用。问题似乎是最后一个/由于某种原因未被识别:( - lunanoko
刚才我注意到你在表达式中没有使用[]来包含点号。当我在我的程序中去掉[]时,正则表达式就可以工作了!你能否(或其他人)解释一下为什么不用括号它就可以工作,而用了括号却不能工作呢?无论如何,感谢你的回答!现在它可以工作了! :) - lunanoko
啊,也许那就是你的问题,[.]将匹配一个字面上的句点,而.将匹配任何字符。 - jtbandes
是的,我在想为什么它们没有匹配相同的东西,但现在我想想,为什么你会想要在[]之间放一个点呢...这毫无意义!感谢您的时间和帮助! :) - lunanoko
这在PHP中不会正常工作,因为您可以在引号文本中使用注释字符。 - Richard

0

试试这个:

r'\/\*\*[^*]*\*+([^/][^*]*\*+)*\/'

(这是一些CSS解析器用于/* CSS注释 */的正则表达式,因此我认为它非常可靠)

它不会匹配包括换行符和内部星号在内的精确格式,但您可以绕过它。 这将匹配:

/**
 * This is a very short block comment
 */

但也:

/** This is a very short block comment */

甚至更多:

/** This is a very short block comment 
*/

为了匹配docblocks的确切格式,您需要一个真正的解析器,而不是正则表达式。

谢谢您的回复。您的表达方式是有效的,尽管像您所说,需要进行一些调整以满足我的需求 :) 不过,我会采用jtbandes的解决方案,因为他的解决方案正好符合我目前的需求 :) 谢谢! - lunanoko
两者都可以完成相同的任务。他的更简单;我只是从我以前的某个东西中复制并粘贴过来的。 - moraes
这在PHP中可能行不通,因为它没有考虑到可能出现在引用文本中的注释字符。因此,它会提取那些不是注释的内容。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接