2013-02-06 81 views
0
testString = ("<h2>Tricks</h2>" 
       "<a href=\"#\"><i class=\"icon-envelope\"></i></a>") 
import re 
re.sub("(?<=[<h2>(.+?)</h2>\s+])<a href=\"#\"><i class=\"icon-(.+?)\"></i></a>", "{{ \\1 @ \\2 }}", testString) 

這產生:invalid group reference正向反向與要提取的匹配組

作出更換隻需要\\1,只提取envelope,這使我認爲後顧之憂被忽略。有沒有一種方法可以從視圖背後提取某些內容?

我很期待產生:

<h2>Tricks</h2> 
{{ Tricks @ envelope }} 
+0

您創建了一個字符類(允許匹配的一組字符),其中包含'<','h','2','>'等等..不要使用'[.. ]''除非你想爲一個匹配創建一組字符('\ s','\ d'等是預先建立的字符類)。 –

+3

看起來像你*真的*想要改用HTML解析器。混合正則表達式和HTML會非常痛苦,真的很快。 –

+0

我正在嘗試爲Sublime Text編輯器編寫一個複雜的F&R,以替換我的文件中的一些內容。而且,如果沒有'[..]','.search'什麼也找不到。 – jolt

回答

1

看起來你真的想使用HTML解析器來代替。混合正則表達式和HTML會非常痛苦,真的很快。

在你的正則表達式,您創建了一個字符類由<(即允許匹配的字符集),H,2>等在這裏:

[<h2>(.+?)</h2>\s+] 

這本來是寫成:

[<>h2()+.?/\s] 

它會匹配相同的字符。

除非您想爲匹配創建一組字符(\ s,\ d等是預構建的字符類),否則不要使用[..]。

但是,即使您要刪除括號,也不允許向後看。您不允許在向後看中使用可變寬度模式(no +或*)。所以,字符類lookbehind不再匹配你認爲它匹配,沒有它 lookbehind是不允許的。

總之,只是BeautifulSoup而已。