查找并替换文本块中的URL,返回文本+ URL列表

时间:2011-10-06 14:58:59

标签: python

我正在尝试找到一种方法来获取一段文本,用其他文本替换该文本中的所有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的顺序并不重要。

谢谢:)

4 个答案:

答案 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复制正则表达式。