質問
これは、配列のいくつかの要素を変更し、一般的な作業のように思えるが、私のソリューションは非常にニシキヘビ感じませんでした。リスト内包で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)
解決
["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するます。
他のヒント
あなたはリストの内包表記で行きたい場合は、使用します:
urls = ['http://' + link if link.startswith('www.') else link for link in links]
しかし、私は実際にあなたが使用されるリンクをループのより詳細な方法は、読みやすいと思います。 「短い」は常に等しい「より良い」または「読みやすく」しません。
あなたは、おそらくのURLを扱うための組み込みのPythonの機能を使用したほうが良いでしょう。あなたの現在の正規表現にとどまると仮定すると、私はあなたがこれを書き換えることができると思います。
from urlparse import urlsplit, urlunsplit
links = re.findall("(?:https?://|www\.|https?://www\.)[\S]+", text)
urls = [urlunsplit(urlsplit(link, 'http')) for link links]
これは、あなたが現在やっていることと同じことに出てくるはずです。また、これはwww.google.comを返します。すなわち、正規表現を使用してURLを見つけることは、やや危険であることに注意してください!感嘆符付きます。
またます:
def addHttp(url):
if url[0:4] == "www.":
url = "http://" + url
return url
urls = map(addHttp, links)
これは長いリストの内包表記と三項演算子を使用するよりもですが、それは、より読みやすい私見関数名は、それが何をしているかを説明し、そのコードは自己文書であるから。また、例えばリファクタリングしやすいですあなたはyu_shaのアドバイスに従うと「WWW」を明示的にテストしないことを決定した場合。