2011-10-06 65 views
2

我試圖找到一種方法來取文本塊,用其他文本替換該文本中的所有網址,然後返回新文本大塊和它找到的URL列表。喜歡的東西:查找並替換一段文本中的URL,返回文本+ URLS列表

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

你能試試我提供的更新正則表達式嗎? – obsoleter

+1

downvoted因爲這個問題已被放棄 – obsoleter

回答

1

如果由於某種原因,你要的網址是有效的格式,使用一些正則表達式的配方。否則,只需分割()您的文本,循環遍歷列表,並且如果一個單詞以「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 
1

你將有一個很難找到一個將谷歌的網址不相匹配的方案,但下面將真正的網址的工作:

>>> re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', text) 
['http://www.imgur.com/12345.jpg'] 
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 
+0

我改變了正則表達式到以下爲了使它不接受短語,如「編輯:你好」作爲URL: 「」「(?i)\ b((?: (FTP | HTTPS):WWW \ d {0,3} | [A-Z0-9 \ - ] +:(/ {1,3} | | [A-Z0-9%])[。] [AZ] {2,4} /)。](?:[^ \ S()<>] + | \(([^ \ S()<>] + |(\([^ \()的<>] + \)))* \))+(?:\(([^ \ S()<>] + |(\([^ \ S()<>] + \)))* \) | [^ \ s'!()\ [\] {};:'「。,<>?]))」「」「 – combatdave

+0

未接受此答案 - 對以下文本無效: '[http:// www .google.com](http://www.google.com)' 給出: ''[{{URL}}',['http://www.google.com](http:// www。 google.com)']' 我太垃圾在正則表達式找出問題:/ – combatdave

+0

所以,我假設你正試圖解析一些降價文本? – obsoleter

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複製過來的正則表達式。