Python 3 正则表达式查找多行注释
我正在用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 的块注释可以用 /*
开始,不仅仅是 /**
。