2

这似乎是一个常见的任务,改变数组的一些元素,但我的解决方案感觉不是很pythonic。有没有更好的方法来构建urls列表理解?

links = re.findall(r"(?:https?://|www\.|https?://www\.)[\S]+", text)
if len(links) == 0:
    return text
urls = []
for link in links:
    if link[0:4] == "www.":
        link = "http://" + link
    urls.append(link)

也许像

links = re.findall(r"(?:https?://|www\.|https?://www\.)[\S]+", text)
if len(links) == 0:
    return text
urls = map(lambda x : something(x), links)
4

4 回答 4

4

如果您想使用列表推导,请使用:

urls = ['http://' + link if link.startswith('www.') else link for link in links]

但我实际上认为循环遍历您使用的链接的更详细的方式更容易阅读。“更短”并不总是等于“更好”或“更易读”。

于 2009-12-02T07:12:21.817 回答
1
["http://"+link if link[0:4]=='www.' else link for link in links]

或者

[link[0:4]=='www.' and "http://"+link or link for link in links]

注意: ("http://"+link if link[0:4]=='www.' else link)- 这是三元运算符,如 ?: 在 C

(link[0:4]=='www.' and "http://"+link or link)- 这具有相同的含义。


关于另一个主题:我会测试 http://,而不是 www。域名不必以 www 开头。例如,http://stackoverflow.com

于 2009-12-02T07:09:58.297 回答
1

使用内置的 Python 功能来处理 url 可能会更好。假设您使用当前的正则表达式,我认为您可以将其重写为:

from urlparse import urlsplit, urlunsplit

links = re.findall("(?:https?://|www\.|https?://www\.)[\S]+", text)
urls = [urlunsplit(urlsplit(link, 'http')) for link links]

这应该与您当前正在做的事情相同。还要记住,使用正则表达式查找 URL 是有风险的,即这将返回 www.google.com!带感叹号。

于 2009-12-02T07:21:24.950 回答
0

或者:

def addHttp(url):
    if url[0:4] == "www.":
        url = "http://" + url
    return url

urls = map(addHttp, links)

这比使用列表推导和三元运算符要长,但恕我直言,它更具可读性,因为函数名称描述了它正在做什么,因此代码是自记录的。重构也更容易,例如,如果您决定遵循 yu_sha 的建议并且不明确测试“www”。

于 2009-12-02T07:25:12.637 回答