两个字符串之间的正则表达式匹配?
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('<!--(.*?)-->', string, re.DOTALL)
应该可以。你在这里不需要^\(-->)
,因为问号使它不贪婪。
您看起来只是在寻找单词?如果是这样,m = re.findall('[\w]+', string, re.MULTILINE)
有什么问题?此外,字符串对于一个,嗯,字符串来说是一个非常糟糕的名字。
【参考方案1】:
这应该可以解决问题
m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
【讨论】:
如果有人想知道,“re.DOTALL”标志使点 (.) 可以匹配任何字符,包括换行符。 (.*?) 捕获括号内的文本,而 .*?表示 .* 的“非贪婪”版本(即捕获最短的匹配)。 如果<!--
和 -->
应该是结果列表项的一部分,则应删除捕获括号 - re.findall ( '<!--.*?-->', 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,当然。我已经编辑了答案以反映这一点以上是关于两个字符串之间的正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章