2011-09-13 11 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')