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

Posted

技术标签:

【中文标题】两个字符串之间的正则表达式匹配?【英文标题】:Regex matching between two strings? 【发布时间】:2012-09-26 00:13:05 【问题描述】:

我似乎找不到像以下示例中那样提取所有 cmets 的方法。

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

two -- -- 的块不匹配很可能是因为正则表达式错误。有人可以指出我正确的方向如何提取两个字符串之间的匹配项。


您好,我已经测试了你们在 cmets 中的建议....这里是一个有效的解决方案,几乎没有升级。

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

谢谢!

【问题讨论】:

[] 之间的任何内容都是单个字符,因此 (-->) 不会查找该分组是问题的一部分... re.findall('&lt;!--(.*?)--&gt;', string, re.DOTALL) 应该可以。你在这里不需要^\(--&gt;),因为问号使它不贪婪。 您看起来只是在寻找单词?如果是这样,m = re.findall('[\w]+', string, re.MULTILINE) 有什么问题?此外,字符串对于一个,嗯,字符串来说是一个非常糟糕的名字。 【参考方案1】:

这应该可以解决问题

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

【讨论】:

如果有人想知道,“re.DOTALL”标志使点 (.) 可以匹配任何字符,包括换行符。 (.*?) 捕获括号内的文本,而 .*?表示 .* 的“非贪婪”版本(即捕获最短的匹配)。 如果 &lt;!----&gt; 应该是结果列表项的一部分,则应删除捕获括号 - re.findall ( '&lt;!--.*?--&gt;', string, re.DOTALL)【参考方案2】:

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

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

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

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

要解析任意 cmets,您需要继续使用解析 context free grammars 的方法。一个简单的方法是使用pushdown automaton。

【讨论】:

我认为嵌套 cmets 并不常见。如果其中的任何内容被处理,有点违背评论的意义? 而且看起来它们在 html 中是不可能的。 ***.com/questions/442786/… 我将把它留在这里,因为我认为承认这一点很重要,但我不希望得到任何支持。 有限状态机无法解析上下文无关文法——你可以使用下推自动机。 @JamesThiele Ahhhhh,当然。我已经编辑了答案以反映这一点

以上是关于两个字符串之间的正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用正则表达式查找两个字符串之间的多个匹配项

javascript正则表达式匹配两个字符串之间的所有内容(没有换行符)[重复]

两个字符串之间的正则表达式匹配,包括那些字符串

正则表达式匹配两个指定字符串之间的内容

js正则表达式 匹配两个特定字符间的内容