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

3 投票
2 回答
4546 浏览
提问于 2025-04-16 23:42

我正在用Python 3的正则表达式来查找PHP源代码中的注释块。PHP的注释格式是这样的:

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

我想出了以下的正则表达式:

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

我觉得结合DOTALL这个选项应该可以找到注释,但结果却没有找到。奇怪的是,当我去掉最后的斜杠,变成这样:

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

然后它就能找到以下字符串:

/**\n\t*

我不知道为什么正则表达式找不到一个星号后面跟着一个斜杠……我检查了我搜索的文件,确认注释里没有拼写错误(确实没有)。而且在正则表达式中,斜杠并不是特殊字符,所以我不需要对它进行转义。(我试过,但没用。)

有没有人能告诉我我的正则表达式哪里出问题了? :)

顺便说一下,我还看到过这个讨论,里面有人试图在Java中做同样的事情。最后的答案和我现在的正则表达式结束方式一样,所以我真的很困惑 :( 这会不会是Python正则表达式的bug,还是我完全理解错了什么?

任何帮助都非常感谢! :D

2 个回答

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 
*/

如果想要精确匹配文档块的格式,你需要一个真正的解析器,而不是仅仅用正则表达式。

5

你可以使用 re.DOTALL 这个标志,让 . 这个符号也能匹配换行符:

re.compile(r'/\*\*.+?\*/', re.DOTALL)

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

撰写回答