2

これは一般的なタスクのようで、配列のいくつかの要素を変更しますが、私のソリューションはあまりパイソン的ではありませんでした。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)-これは同じ意味です。


別のテーマについて:私はwwwではなくhttp://をテストします。ドメインはwwwで始まる必要はありません。たとえば、http://stackoverflow.comです。

于 2009-12-02T07:09:58.297 に答える
1

URLを処理するために組み込みの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が返されます。感嘆符付き。

于 2009-12-02T07:21:24.950 に答える
0

または:

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

urls = map(addHttp, links)

これは、リスト内包表記と三項演算子を使用するよりも長くなりますが、関数名が実行内容を記述しているため、コードが自己文書化されているため、IMHOの方が読みやすくなっています。また、yu_shaのアドバイスに従い、「www」を明示的にテストしない場合など、リファクタリングも簡単です。

于 2009-12-02T07:25:12.637 に答える