最佳答案是...
不要使用正则表达式
被接受的答案中的表达式会忽略许多情况。其中,URL中可能包含Unicode字符。你需要的正则表达式在这里,当你查看它后,你可能会得出结论,你实际上并不需要它。最正确的版本长度为一万个字符。
诚然,如果你从一些普通的、无结构的文本开始,并且其中有很多URL,那么你可能需要那个一万个字符长的正则表达式。但如果你的输入有结构,请利用这个结构。你声明的目标是“提取锚标签href内的URL”。你为什么要使用一万个字符长的正则表达式,而不是更简单的方法呢?
解析HTML
对于许多任务,使用Beautiful Soup将会更快、更容易使用:
>>> from bs4 import BeautifulSoup as Soup
>>> html = Soup(s, 'html.parser') # Soup(s, 'lxml') if lxml is installed
>>> [a['href'] for a in html.find_all('a')]
['http://example.com', 'http://2.example']
如果您不想使用外部工具,您也可以直接使用Python内置的HTML解析库。这是一个非常简单的HTMLParser
子类,可以完全满足您的需求:
from html.parser import HTMLParser
class MyParser(HTMLParser):
def __init__(self, output_list=None):
HTMLParser.__init__(self)
if output_list is None:
self.output_list = []
else:
self.output_list = output_list
def handle_starttag(self, tag, attrs):
if tag == 'a':
self.output_list.append(dict(attrs).get('href'))
测试:
>>> p = MyParser()
>>> p.feed(s)
>>> p.output_list
['http://example.com', 'http://2.example']
你甚至可以创建一个新的方法,该方法接受一个字符串,调用feed
方法,并返回output_list
。这是从HTML中提取信息比正则表达式更加强大和可扩展的方式。