2011-08-16 137 views
3

我试图找到使用在Python 3正则表达式在PHP源代码中的注释块的PHP评论都是这种格式:Python 3的正则表达式查找多行注释

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

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

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

我的身影,与DOTALL -in组合升旗应该这样做,但是没有。它没有找到任何东西。奇怪的是,当我删除尾随斜杠,像这样:

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

然后找到以下字符串:

/**\n\t* 

我不知道为什么正则表达式不能找到一个星号后面斜线......我检查了我正在搜索的文件,仔细检查我在评论中没有输入错误(我没有)。 另外斜杠在正则表达式中并不是特殊字符,所以我不必逃避它。 (我试过了,但没有帮助。)

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

顺便说一下,我也遇到了this!有人试图在Java中做同样的事情。最终获胜的答案以我现在做的相同的方式完成了他的正则表达式,所以我很无知:(这可能是Python正则表达式中的错误还是我完全缺少某些东西?

任何帮助非常感谢!:D

+0

为什么你在你的模式中有'[。]'?与之相反+ – arunkumar

+0

那么,因为起初我没有使用[。\ s] DOTALL标志。在我删除了\ s并添加了DOTALL标志后,方括号仍然留在那里。但是,我没有删除他们,他们似乎导致了问题。如果有人关心解释吗?就我的正则表达式知识而言'。+'应该与[。] +相同的东西匹配吗? – lunanoko

回答

4

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

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

(作为一个方面说明,PHP块注释可以用/*开始,不只是/**

+0

我的不好,我忘了在我的文章中包含DOTALL标志。我在我的程序中做了它,但它不起作用。这个问题似乎是最后/因为某种原因不被识别:( – lunanoko

+0

)你能显示你已经尝试过的确切代码吗? – jtbandes

+0

刚才我注意到你不用[]在你的周围。表达式当我在程序中删除[]时,正则表达式起作用!你能(或者其他人)解释为什么它没有括号但不起作用吗?谢谢你的回答! – lunanoko

0

试试这个:

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

(这是/* CSS comments */使用一些CSS解析器正则表达式,所以我认为这是非常稳固)

它不会匹配包括换行和精确格式内部星号,但你可以工作周围。这将匹配:

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

但也:

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

甚至:

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

要匹配文档块的具体格式,你需要一个真正的解析器,不是正则表达式。

+0

谢谢您的回复。尽管如你所说,你的表达方式很有效,但需要根据我的需求进行一些调整:)尽管使用jtbandes的解决方案,但是,因为他现在正是我想要的东西:)谢谢! – lunanoko

+0

两者都做同样的事情。他更简单;我只是从我所拥有的东西上复制粘贴。 – moraes

+0

这在PHP中不起作用,因为它没有考虑可能出现在引用文本中的注释字符。因此,它会提取不是评论的东西。 – Richard

相关问题