我正在尝试找到一种方法来获取一段文本,用其他文本替换该文本中的所有URL,然后返回新文本块和它找到的URL列表。类似的东西:
text = """This is some text www.google.com blah blah http://www.imgur.com/12345.jpg lol"""
text, urls = FindURLs(text, "{{URL}}")
应该给:
text = "This is some text {{URL}} blah blah {{URL}} lol"
urls = ["www.google.com", "http://www.imgur.com/12345.jpg"]
我知道这将涉及一些正则表达式 - 我在这里找到了一些看似很好的URL检测正则表达式: http://www.regexguru.com/2008/11/detecting-urls-in-a-block-of-text/
但是,我对正则表达式很垃圾,所以我发现用python做我想做的事非常棘手。返回URL的顺序并不重要。谢谢:)
答案 0 :(得分:3)
正则表达式here应该足够宽松,以便在没有http或www。
的情况下捕获网址这是一些简单的python代码,它执行文本替换并为您提供结果列表:
import re
url_regex = re.compile(r"""(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>\[\]]+|\(([^\s()<>\[\]]+|(\([^\s()<>\[\]]+\)))*\))+(?:\(([^\s()<>\[\]]+|(\([^\s()<>\[\]]+\)))*\)|[^\s`!(){};:'".,<>?\[\]]))""")
text = "This is some text www.google.com blah blah http://www.imgur.com/12345.jpg lol"
matches = []
def process_match(m):
matches.append(m.group(0))
return '{{URL}}'
new_text = url_regex.sub(process_match, text)
print new_text
print matches
答案 1 :(得分:1)
如果由于某种原因您希望网址格式有效,请使用一些正则表达式配方。否则,只需split()你的文本,循环遍历列表,如果一个单词以“www”或“http”开头,则相应地处理它。 然后加入()返回列表。
text = """This is some text www.google.com blah blah http://www.imgur.com/12345.jpg lol"""
s = text.split()
urls = []
for i in range(len(s)):
item = s.pop(0)
if item.startswith("www") or item.startswith("http"):
s.append("{{URL}}")
urls.append(item)
else:
s.append(item)
print " ".join([i for i in s])
print urls
答案 2 :(得分:1)
如果没有方案,您将很难找到与Google网址匹配的网址,但以下内容适用于真实网址:
>>> re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', text)
['http://www.imgur.com/12345.jpg']
答案 3 :(得分:0)
我就是这样做的:
urlpattern = re.compile(r"""(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))""")
def urlify(value):
return urlpattern.sub(r'<a href="\1">\1</a>', value)
用法:
>>> urlify('DuckDuckGo https://duckduckgo.com, the search engine that doesn\'t track you')
'Duckduckgo <a href="https://duckduckgo.com">https://duckduckgo.com</a>, the search engine that doesn\'t track you'
从https://daringfireball.net/2010/07/improved_regex_for_matching_urls复制正则表达式。