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

Posted

技术标签:

【中文标题】Python 3 正则表达式查找多行注释【英文标题】:Python 3 regular expression to find multiline comment 【发布时间】:2011-10-28 06:06:46 【问题描述】:

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

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

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

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

我认为 - 结合 DOTALL 标志 - 应该这样做,但不是。它什么也没找到。奇怪的是,当我删除斜杠时,像这样:

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

然后它会找到以下字符串:

/**\n\t*

我不知道为什么正则表达式找不到星号后跟斜杠...我检查了我正在搜索的文件以仔细检查我在评论中没有错字(我没有)。 斜杠在正则表达式中也不是特殊字符,所以我不必转义它。 (我试过了,但没用。)

谁能告诉我我的正则表达式有什么问题? :)

对了,我也遇到了this!有人试图在 Java 中做同样的事情的线程。最终获胜的答案以我现在的方式完成了他的正则表达式,所以我一无所知:(这可能是 Python 正则表达式中的错误还是我完全遗漏了什么?

非常感谢任何帮助! :D

【问题讨论】:

为什么你的模式中有[.]?而不仅仅是 .+ 好吧,因为起初我使用 [.\s] 没有 DOTALL 标志。在我删除 \s 并添加 DOTALL 标志后,方括号一直在那里徘徊。但是,我没有删除它们,它们似乎导致了问题。如果有人愿意解释一下?就我的正则表达式知识而言,'.+' 应该与 [.]+ 匹配相同的内容,对吗? 【参考方案1】:

试试这个:

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

(这是一些 CSS 解析器为/* CSS comments */ 使用的正则表达式,所以我相信它非常可靠)

它与包括换行符和内部星号在内的确切格式不匹配,但您可以解决它。这将匹配:

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

还有:

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

甚至:

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

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

【讨论】:

感谢您的回复。您的表达有效,尽管就像您说的那样,它需要根据我的需要进行一些调整:) 不过,使用 jtbandes 的解决方案,因为他现在正是我想要的 :) 谢谢! 两者都做同样的事情。他的更简单;我只是从我拥有的东西中复制和粘贴。 这在 PHP 中不起作用,因为它不考虑可能出现在引用文本中的注释字符。因此,它会提取不是 cmets 的东西。【参考方案2】:

您可以使用re.DOTALL 标志使. 字符匹配换行符:

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

(附带说明,PHP 块 cmets 可以以 /* 开头,而不仅仅是 /**。)

【讨论】:

我的错,我忘记在我的帖子中包含 DOTALL 标志。虽然我在我的程序中做到了,但它不起作用。问题似乎是由于某种原因最后一个 / 未被识别:( 刚才我注意到您不在 .在你的表达中。当我删除程序中的 [] 时,正则表达式有效!您(或其他人)能否解释为什么它可以在没有括号的情况下工作但不能与它们一起工作?无论如何感谢您的回答!现在可以了! :) 啊,这可能是你的问题,[.] 将匹配文字句点,而 . 将匹配任何字符。 是的,我想知道为什么它们不匹配相同的东西,但现在我细化了它,你为什么会想要一个 .在 [] 之间......这没有任何意义!感谢您的时间和帮助! :) 这在 PHP 中无法正常工作,因为您可以在引用的文本中包含注释字符。

以上是关于Python 3 正则表达式查找多行注释的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式删除多行注释

防止在正则表达式上回溯以查找非注释行(不以缩进的“#”开头)

注释的正则表达式,但不在“字符串”内/不在另一个容器中

正则表达式去除 phpdoc 多行注释

使用正则表达式匹配 Lua 多行字符串和注释

使用 Perl 正则表达式删除多行 C 样式 /* 注释 */