我希望能夠使用python正則表達式捕獲HTML屬性的值。 目前我使用正則表達式匹配開始從句與結尾
re.compile(r'=(["\'].*?["\'])', re.IGNORECASE | re.DOTALL)
我的問題是,我想正則表達式「記住」的屬性是否開始與單個或雙引號。
我發現在我目前的做法錯誤具有以下屬性
href="javascript:foo('bar')"
我正則表達式捕捉
"javascript:foo('
我希望能夠使用python正則表達式捕獲HTML屬性的值。 目前我使用正則表達式匹配開始從句與結尾
re.compile(r'=(["\'].*?["\'])', re.IGNORECASE | re.DOTALL)
我的問題是,我想正則表達式「記住」的屬性是否開始與單個或雙引號。
我發現在我目前的做法錯誤具有以下屬性
href="javascript:foo('bar')"
我正則表達式捕捉
"javascript:foo('
您可以捕獲第一次報價,然後使用一個反向引用:
r'=((["\']).*?\2)'
但是,正則表達式是not the proper approach to parsing HTML。您應該考慮使用DOM解析器。
我只是想強調一下,不要在答案中做。 *不要這樣做*。每當有人試圖用正則表達式解析HTML(或更糟:XML)時,一些SO用戶會殺死一隻小狗! –
謝謝,我保證記住你的警告;-) – elewinso
下會在理論上更高效:
regex = r'"[^"]*"|\'[^']*\''
對於參考,這裏的傑弗裏·弗裏德爾的expression HTML標記(從貓頭鷹冊):
< # Opening "<"
( # Any amount of . . .
"[^"]*" # double-quoted string,
| # or . . .
'[^']*' # single-quoted string,
| # or . . .
[^'">] # "other stuff"
)* #
> # Closing ">"
這正是爲什麼你不用正則表達式解析HTML。角落案例太多了。抓住[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)的副本,並以正確的方式做到這一點。我保證它會更容易(嚴重)。 – Blender