2012-01-13 30 views
0

下面的正則表達式來提取從頁面的URL鏈接:如何匹配「或「有」或」正則表達式中

LINK_REGEX = re.compile("<a [^>]*href=['\"]([^'\"]+)['\"][^>]*>") 

問題1>如何表示下面的字符串?我錯配'「中和目的

<a href="http://www.yahoo.com'> 

我曾嘗試以下語句,並沒有爲我工作。

>>> page = '<a href="http://www.yahoo.com\'>' 
>>> page 
'<a href="http://www.yahoo.com\'>' 
>>> page = '<a href="http://www.yahoo.com''>' 
>>> page 
'<a href="http://www.yahoo.com>' 

問題2>根據我的理解,通過設計,LINK_REGEX將匹配如何修改正則表達式,以便強制匹配'with'或'with'。

+0

你可以通過使用兩個更簡單的正則表達式來簡化你的生活... – fge 2012-01-13 22:05:16

+0

三重引號是你的朋友在這裏。嘗試:'page =「」「 2012-01-13 23:11:25

回答

0

['"]將匹配'"

(['"]).+\1將匹配帶引號的帶引號的字符串。 parens(match group)中的表達式將匹配單引號或雙引號,並且\1將匹配第一匹配組匹配的任何內容(這稱爲「反向引用」)。

注意的報價是在表達任何方式逃脫,使他們​​更具可讀性。您的正則表達式字符串可能需要至少轉義一種引號。

+0

嗯,考慮一下'';) – fge 2012-01-13 22:45:38

+0

@fge:非貪婪的限定符來拯救!使用'+?'而不是普通的'+'。問題的關鍵在於匹配相同的引用;其餘的是作爲一個練習:) – 9000 2012-01-14 03:22:07

1

(我會發布這作爲註釋,如果我有特權。)

如果你試圖解析HTML,強烈建議您不要使用正則表達式。如果您使用BeautifulSoup或lxml.html這樣的HTML解析模塊,您將會節省很多麻煩和問題。

其次,你使用正則表達式,每次差不多,一定要預先考慮r到您的字符串,像這樣:

LINK_REGEX = re.compile(r"<a [^>]*href=['\"]([^'\"]+)['\"][^>]*>")

這將確保東西都正確轉義。

如果你肯定需要使用正則表達式,「9000's」的答案會適合你。

0

使用兩正則表達式:

<a\s*[^>]*href="([^"]+)"[^>]*> # double quoted strings 
<a\s*[^>]*href='([^']+)'[^>]*> # single quoted strings 

href內容將隨後是第二組中使用。

+0

那麼:'? – ekhumoro 2012-01-14 04:14:21

+0

是的,這就是爲什麼我第一次評論說,它會更容易使用兩個正則表達式... – fge 2012-01-14 04:21:21

+0

...在編輯的文章 – fge 2012-01-14 04:23:17

相關問題