这似乎是一个常见的任务,改变了数组的某些元素,但我的解决方案并没有感觉到非常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)
答案 0 :(得分:4)
如果您想使用列表推导,请使用:
urls = ['http://' + link if link.startswith('www.') else link for link in links]
但实际上我认为循环使用您使用的链接的更冗长的方式更容易阅读。 “较短”并不总是等于“更好”或“更具可读性”。
答案 1 :(得分: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)
- 这是三元运算符,如?:in C
(link[0:4]=='www.' and "http://"+link or link)
- 这具有相同的含义。
关于另一个主题:我会测试http://,而不是www。域名不必以www开头。例如,http://stackoverflow.com。
答案 2 :(得分:1)
使用内置的Python功能处理网址可能会更好。假设你继续使用当前的正则表达式,我认为你可以将其重写为:
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!带有感叹号。
答案 3 :(得分:0)
可替换地:
def addHttp(url):
if url[0:4] == "www.":
url = "http://" + url
return url
urls = map(addHttp, links)
这比使用列表推导和三元运算符更长,但恕我直言,因为函数名称描述了它正在做什么,所以它更具可读性,因此代码是自我记录的。例如,重构也更容易如果您决定遵循yu_sha的建议而不是明确测试“www”。