18

我似乎无法找到一种方法来提取以下示例中的所有评论。

>>> import re
>>> string = '''
... <!-- one 
... -->
... <!-- two -- -- -->
... <!-- three -->
... '''
>>> m = re.findall ( '<!--([^\(-->)]+)-->', string, re.MULTILINE)
>>> m
[' one \n', ' three ']

由于正则表达式错误,很可能与 block withtwo -- --不匹配。有人可以指出正确的方向如何提取两个字符串之间的匹配项。


嗨,我已经测试了你们在评论中提出的建议....这是工作解决方案,几乎没有升级。

>>> m = re.findall ( '<!--(.*?)-->', string, re.MULTILINE)
>>> m
[' two -- -- ', ' three ']
>>> m = re.findall ( '<!--(.*\n?)-->', string, re.MULTILINE)
>>> m
[' one \n', ' two -- -- ', ' three ']

谢谢!

4

2 回答 2

38

这应该可以解决问题

 m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
于 2012-10-04T21:24:10.170 回答
3

一般来说,用正则文法在两个分隔符之间进行任意匹配是不可能的。

具体来说,如果您允许嵌套,

<!-- how do you deal <!-- with nested --> comments? -->

你会遇到问题。因此,虽然您可以使用正则表达式解决这个特定问题,但您编写的任何正则表达式都可能被其他一些奇怪的注释嵌套破坏。

要解析任意注释,您需要继续使用一种解析上下文无关语法的方法。一个简单的方法是使用下推自动机

于 2012-10-04T21:25:09.783 回答