正则表达式匹配两个字符串?

时间:2012-10-04 21:16:19

标签: python regex python-3.x regex-negation

我似乎无法找到提取所有评论的方法,如下例所示。

>>> import re
>>> string = '''
... <!-- one 
... -->
... <!-- two -- -- -->
... <!-- three -->
... '''
>>> m = re.findall ( '<!--([^\(-->)]+)-->', string, re.MULTILINE)
>>> m
[' one \n', ' three ']
由于正则表达式错误,

阻止two -- --的阻止最不可能匹配。有人可以指出我正确的方向如何提取两个字符串之间的匹配。


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

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

谢谢!

2 个答案:

答案 0 :(得分:36)

这应该可以解决问题

 m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)

答案 1 :(得分:3)

一般情况下,使用regular grammar在两个分隔符之间进行任意匹配是不可能的。

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

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

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

要解析任意注释,您需要转到解析context free grammars的方法。一个简单的方法是使用pushdown automaton