2012-11-01 56 views
1

我希望能夠使用python正則表達式捕獲HTML屬性的值。 目前我使用正則表達式匹配開始從句與結尾

re.compile(r'=(["\'].*?["\'])', re.IGNORECASE | re.DOTALL) 

我的問題是,我想正則表達式「記住」的屬性是否開始與單個或雙引號。

我發現在我目前的做法錯誤具有以下屬性

href="javascript:foo('bar')" 

我正則表達式捕捉

"javascript:foo(' 
+2

這正是爲什麼你不用正則表達式解析HTML。角落案例太多了。抓住[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)的副本,並以正確的方式做到這一點。我保證它會更容易(嚴重)。 – Blender

回答

3

您可以捕獲第一次報價,然後使用一個反向引用:

r'=((["\']).*?\2)' 

但是,正則表達式是not the proper approach to parsing HTML。您應該考慮使用DOM解析器。

+2

我只是想強調一下,不要在答案中做。 *不要這樣做*。每當有人試圖用正則表達式解析HTML(或更糟:XML)時,一些SO用戶會殺死一隻小狗! –

+0

謝謝,我保證記住你的警告;-) – elewinso

1

下會在理論上更高效:

regex = r'"[^"]*"|\'[^']*\'' 

對於參考,這裏的傑弗裏·弗裏德爾的expression HTML標記(從貓頭鷹冊):

<    # Opening "<" 
    (   # Any amount of . . . 
    "[^"]*" #  double-quoted string, 
    |   #  or . . . 
    '[^']*' #  single-quoted string, 
    |   #  or . . . 
    [^'">] #  "other stuff" 
)*   # 
>    # Closing ">"