2011-09-13 77 views
1

代碼的相關部分是:Python:你如何使用re忽略括號中的鏈接?

import re 
reargs = '<a\s*href=[\'|"](.*?)[\'"].*?>' 
link = re.search(reargs,content,flags=re.IGNORECASE) 

我建立一個履帶式和網頁我與在括號環節的工作,我不想因此這將是這樣的:

富FOO FOO FOO(鏈路)FOO FOO FOO FOO 鏈路 FOO FOO FOO FOO(FOO 鏈路富)FOO FOO 鏈路 FOO FOO 鏈路 ......等等

+4

不要使用正則表達式來解析HTML。使用(X)HTML解析器。 BeautifulSoup浮現在腦海中。 –

+1

[用正則表達式解析HTML/XML可能會有問題。](http://stackoverflow.com/questions/1732348/1732454#1732454) –

+1

要添加更多細節,儘管現代正則表達式可以做事就像你問的那樣,這通常不是最好的主意。一個很好的線索,你應該使用一些不同的技術,事實上,你試圖匹配平衡括號,並有嵌套項目的可能性。 – Wilduck

回答

0

如果可以有多組嵌套圓括號,如「((foo)鏈接)」,我不認爲這是正常表達式可能的。特別要注意的是,圓括號可以用在URL內部(比如在wikipedia),所以即使文本本身不包含任何內容,仍然可能會有嵌套的parens。所以,在一般情況下,我認爲這不能用正則表達式來完成。

爲了解決這個問題,我會假設你最多可以有1個括號,並且沒有URL包含圓括號。

你正在尋找的正則表達式是類似以下內容:

(\([^\)]*\)|[^\(<])*_link_ 

_link_是一個正則表達式匹配的鏈接(你的問題陳述形容,儘管它可能需要一些調整)。總結我的正則表達式的第一部分是什麼:它匹配0或更多的括號聲明或非鏈接非括號字符。現在,使用匹配的反向引用(在您的示例中爲link.group(2))來查找您的URL。

0

通常用正則表達式解析HTML是一個壞主意。但是因爲你提出了問題,並且普遍的問題是有價值的(如何忽略你的比賽被括號包圍的情況),我會告訴你我的想法。

現在,因爲我不知道你的頁面是什麼樣子的,我只想說,通常情況下,你可以通過加入[^x]來排除匹配,除非x是你不想要的字符。括號使其能夠匹配任何內容,並且^不包括以下任何內容。

所以,你可以用[^(] foo [^)]圍住你的匹配字符串排除括號。如果圓括號之間還有其他字符,則必須分別考慮這些字符。

0

隨着lxml你可以做這樣的事情:

import lxml.html 
import re 

tree = lxml.html.parse("http://pastehtml.com/view/b7604in99.html") 
links = tree.xpath("//a") 

for link in links: 
    if re.match(r'^\(.*\)$', link.text.strip()): 
     print link.get('href')