2014-11-20 56 views
0

我們的想法是一致h3></section之前到來的所有代碼塊在比賽實際上是一個數字<p>...</p>元素無效的回顧後HTML標記

的這實際上是在崇高的文本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,改變了。另外,看看是否有類似的問題

+2

崇高文本實際使用PCRE正則表達式引擎,而不是Python的 – MattDMo 2014-11-20 18:30:18

+2

在Perl中,通常可以使用'\ K'解決缺少可變長度lookbehinds的。 (注意,'\ s'包括'\ n'在Perl中,也可能在其他地方.'s \\ K ikegami 2014-11-20 18:30:56

+1

啊!謝謝。我會考慮寫在PCRE – ferhtgoldaraz 2014-11-20 18:31:04

回答

0

的問題是關於PCRE評論:

首先,MattDMo評論,崇高使用PCRE正則表達式引擎。

其次,正則表達式的第三個borken部分(?!\s*<\/section)是一個負向前瞻,它應該是一個正向(如果後面跟着,如果沒有後面跟着)。那將是(?=\s*</section)

第三,在PCRE lookbehinds中不能包含*,因爲它們的長度必須是固定的。這可以通過\K轉義來解決,該轉義重置當前整個匹配的開始,即,如果後面跟着未包括的匹配,則匹配。

最後,在正則表達式的第二個細分部分中,<p(?:\n|.)*最後應該包含?,變成<p(?:\n|.)*?。這樣匹配就是懶惰(非貪婪)。

什麼woked是:

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