【问题标题】:Invalid Lookbehind With HTML Tags带有 HTML 标记的无效 Lookbehind
【发布时间】:2014-11-20 18:28:18
【问题描述】:

这个想法是匹配 h3> 之后和 </section 之前的所有代码块,其中匹配实际上是多个 <p>...</p> 元素

这实际上是在 sublime text 3 中(在文件中查找所有内容),目的是将所有这些块包装在 <div><\div> 标签中(感谢 emmet 插件,ctrl+shift+g)...

...所以,如果您知道它应该有效,请告诉我,我将不再担心它。或者,如果您能想出另一种方法来归档相同的目标,那也太棒了。

我的想法是:

(?<=<\/h3\s*)<p(?:\n|.)*(?!\s*<\/section)

分解后会变成……

(?<=<\/h3\s*)        # lookbehind for </h3 and any space including newline
<p(?:\n|.)*          # match, if it follows, <p and anything...
(?!\s*<\/section)    # if not followed by spaces and <\section

我收到Invalid lookbehind asserion...,它似乎是第一个星号。

这在 python 3 中是否正确?

已编辑:\s 包括 \n,已更改。另外,如果有类似问题,请参阅有关 PCRE 的评论

【问题讨论】:

  • Sublime Text 实际上使用的是 PCRE 正则表达式引擎,而不是 Python 的
  • 在 Perl 中,您通常可以使用 \K 来解决缺少可变长度后视的问题。 m{&lt;/h3\s*\K&lt;p.*(?!\s*&lt;/section)}s(请注意,\s 在 Perl 中包括 \n,可能在其他任何地方也一样。)
  • 啊!谢谢。我会考虑在 PCRE 中编写它
  • .*(?!\s*&lt;/section) 肯定不会做正确的事。我想你在找(?:(?!\s*&lt;/section).)*
  • @ikegami 我注意到 \s,谢谢,不知道为什么我认为 sublime 需要两者,它不需要

标签: regex sublimetext sublimetext3 pcre


【解决方案1】:

问题是:

首先,正如 MattDMo 所说,Sublime 使用 PCRE 正则表达式引擎。

第二,正则表达式的第三个分解部分,(?!\s*&lt;\/section) 是一个负前瞻,它应该是一个正前瞻(如果紧随其后,而不是紧随其后)。那将是(?=\s*&lt;/section)

第三,在 PCRE 中,lookbehinds 不能包含 *,因为它们必须是固定长度的。这可以通过\K 转义来解决,该转义会重置当前整个匹配的开始,即,如果后面跟着 \K 匹配之前的不包括在内的匹配。

最后,在正则表达式的第二个细分部分,&lt;p(?:\n|.)* 应该在末尾包含?,变成&lt;p(?:\n|.)*?。这样匹配是惰性的(非贪婪的)。

醒来的是:

h3>\s*\K<p(?:\n|.)*?(?=\s*</section)

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多