【问题标题】: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) 有什么问题?此外,字符串对于一个,嗯,字符串来说是一个非常糟糕的名字。

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


【解决方案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 中是不可能的。 stackoverflow.com/questions/442786/… 我将把它留在这里,因为我认为承认这一点很重要,但我不希望得到任何支持。
  • 有限状态机无法解析上下文无关文法——你可以使用下推自动机。
  • @JamesThiele Ahhhhh,当然。我已经编辑了答案以反映这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多