URLを作業リンクに変換する関数を書いています。これはすべての形式を変換する必要があります: のような完全な url http://link.com
、プロトコルのようなものなし、www.link.com
拡張子のようなものだけでもlink.com
。
これまでのところ、私の関数は機能していますが、文字列に同じリンクが複数回あると奇妙なバグがあります。
import re
import cgi
def process_links(string):
"""Convert urls to links in a string"""
# http + https
links = re.findall("(https?://[^\s]+)", string)
# www
links2 = re.findall("(w{3}\.[^\s]+)", string)
# only extension
links3 = re.findall("([^\s]+\.[^\s]{2,})", string)
links = links + links2 + links3
# remove duplicates
links = list(set(links))
string = cgi.escape(string)
for link in links:
# make sure the href attr starts with http|https
if re.match('https?://', link) is None:
http_link = 'http://'+link
else:
http_link = link
htmlLink = '<a href="'+http_link+'">'+link+'</a>'
string = re.sub(link, htmlLink, string)
return string
動作例と失敗例:
# working
string = 'firstlink.com and www.secondlink.com'
# output:
# '<a href="http://firstlink.com">firstlink.com</a> and <a href="http://www.secondlink.com">www.secondlink.com</a>
# failing: when there are several times the same link
string = 'firstlink.com and http://firstlink.com
# output:
# <a href="<a href="http://firstlink.com">http://firstlink.com</a>">firstlink.com</a> and http://<a href="<a href="http://firstlink.com">http://firstlink.com</a>">firstlink.com</a>
Pythonでこの「複雑な」正規表現を使用しようとしたことはなく、なぜこの奇妙な動作があるのか わかりません。re.sub()
これは、すでに置き換えられているものを置き換える可能性がある部分から来ていると思いますか?
PS: 私の機能はおそらく最高ではなく、確実に改善される可能性があります。何か提案があれば聞いています。