2017-07-14 39 views
3

我一直在試圖使一個正則表達式能夠匹配「任何」,但一定的標記,我正在按照這個答案(Match everything except for specified strings),但它根本不工作...正則表達式能夠匹配任何東西,但特定的標記

下面是一個例子

text = '<a> whatever href="obviously_a_must_have" whatever <div> this div should be accepted </div> ... </a>' 

regex = r'<a[^><]*href=\"[^\"]+\"(?!.*(</a>))*</a>' #(not working as intended) 

[^><]* #- should accept any number of characters except <and>, meaning it shouldn't close the tag nor open a new one - *working*; 
href=\"[^\"]+\" #- should match an href - *working*; 
(?!.*(</a>))* #- should match anything but the end of the tag a - *NOT WORKING*. 
+1

什麼不工作? [請注意,正則表達式不是解析html的正確工具。](https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 ) –

+0

嘿@HåkenLid,正則表達式的第三部分沒有按預期工作。別擔心!我解析html的合法方式;)但我仍然必須使用這個正則表達式匹配某些標準,因爲我不想要所有類型的標籤,只是某些標籤。這只是一個例子! –

+0

由於該組無法量化,因此不能在'(?!)'負向預讀組之後直接放置* *量詞。嘗試在線編輯器中的代碼[立即顯示](https:// regex101。COM/R/qAlpvE/1)。我並不是100%確定你想用這個'*'量詞來做什麼? –

回答

0

的問題是,在

(?!.*(</a>))* 

你有兩個錯誤。

  • /應該被轉義。改爲使用\/

  • 您不能在其他*上使用*。嘗試在regex101,它會說:* The preceding token is not quantifiable。我強烈建議該網站進行正則表達式測試和理解。

您的第一部分也不起作用,因爲您在文本和正則表達式之後會出現不匹配的情況。

讓我們嘗試一下本作開頭:

<a>[^><]*href=\"[^\"]+\".*(?:<\/a>) 

這正則表達式是更好的,它會匹配文本。但它還沒有完整,因爲它與額外的文字匹配。我們不希望在真正結束之前的任何地方出現額外的結局。所以,讓我們添加一個負回顧後:

<a>[^><]*href=\"[^\"]+\"(?:(?<!<\/a>).)*(?:<\/a>) 

但你可以看到here,它只是匹配的第一個結束標籤和igniores等。我們想擺脫它。另外,我們不需要額外的開始標籤。讓我們通過開始和結束限制匹配。

^<a>[^><]*href=\"[^\"]+\"(?:(?<!<\/a>).)*(?:<\/a>)$ 

Here是測試。

也許,你寧願要保持href在<a...>?有些事情是如此:

'<a whatever href="obviously_a_must_have"> whatever <div> this div should be accepted </div> ... </a>' 

然後,正則表達式爲:

^<a[^><]*href=\"[^\"]+\"[^><]*>(?:(?<!<\/a>).)*(?:<\/a>)$ 

測試是here

在開發正則表達式時,我建議首先做一些簡單的事情,用很多。*來匹配所有東西,然後一步一步地將它們改爲真正的東西。

相關問題