2011-07-16 95 views
3

我有這樣的正則表達式:Python正則表達式一次 - 匹配的網址

re.compile(r"((https?):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", re.MULTILINE|re.UNICODE) 

但是,這並不包括hashbangs (#!)。我需要改變什麼才能讓它工作?我知道我可以補充!與#@%等組,但這將選擇類似

Check this out: http://example.com/something/!!! 

我想避免這種情況。

+2

的例子如何檢查出RFC的URI語法(http://www.ietf.org/rfc/rfc3986.txt)?它會告訴你,爆炸只能以某種方式使用,否則它必須逃脫。好問題。 –

+1

我希望你沒有試圖使用這個正則表達式來匹配瀏覽器所請求的URL:如果是這樣,你應該認識到哈希後的部分不是在普通的客戶端請求中發送的。 –

+0

不。我正在解析用戶輸入,併爲用戶建立更短,更安全的鏈接(我們完全控制,我們可以阻止鏈接,域等)。而原始的正則表達式有http://ourshortdomain.foo/urlhash/#!/twitter/something;) – ThomK

回答

10

不要試圖使自己的正則表達式匹配的URL,用別人的誰已經解決了這樣的問題,像this one

+10

雖然使用別人的代碼沒有什麼錯,但在編寫自己的代碼時也沒有錯! :)我想如果每個人都會遵循這個建議_「不要試圖製造你自己的,請使用別人的」_我們仍然會生活在洞穴中! ;) – mac

+0

@mac - 如果每個人都必須重塑一切,那麼我們的進展會更緩慢。更好地使用他人完成的想法,然後通過改進或添加新的東西來使其更好。甚至牛頓也承認他正在建立在別人工作的基礎上。 – unpythonic

+0

@Mark - 我當然不會與此爭論,我從來沒有說過,任何人都應該重新發明輪子! :)我只是認爲沒有一條硬性的規則可以遵循:有時使用他人的作品是有道理的,有時它不會。 – mac

0

我承認我有點擔心一個需要像這樣的正則表達式來匹配URL的應用程序。這就是說,這似乎適用於我:

((https?):((//)|(\\\\))+([\w\d:#@%/;$()~_?\+-=\\\.&](#!)?)*) 
0

這是一個常見問題,使用默認庫。

Python的使用urlparse

+0

urlparse仍然會解析OP的問題URL:urlparse。裏urlparse('HTTP://example.com/something/!') – hoju

+0

那麼這是一個有效的url,所以首先使用url解析器來獲取信息。然後你可以決定如何處理它。我懷疑一個語義解析器是否真的是他想要的,更簡單的方法就是試試這個url。如果它不起作用,去掉最後的字符然後再試一次... – estani

0

這可能是很長,但是在實踐中防雷工程相當不錯的。請試試這個 ((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z]){2,6}([a-zA-Z0-9\.\&\/\?\:@\-_=#])*

它匹配所有低於

http://wwww.stackoverflow.com 
abc.com 
http://test.test-75.1474.stackoverflow.com/ 
stackoverflow.com/ 
stackoverflow.com 
[email protected] 
http://www.example.com/etcetc 
www.example.com/etcetc 
example.com/etcetc 
user:[email protected]/etcetc 
(www.itmag.com) 
example.com/etcetc?query=aasd 
example.com/etcetc?query=aasd&dest=asds 
http://stackoverflow.com/questions/6427530/regular-expression-pattern-to- 
match-url-with 
www/[email protected] 
[email protected] 
[email protected] 
[email protected]