2016-01-29 46 views
2

我有這個包含URL的示例向量。我的目標是獲取URL的路徑。查找第三次出現的特殊字符並放棄之前的所有內容R

sample1 <- c("http://tercihblog.com/indirisu/docugard/", "http://funerariagomez.com/js/ggogle/a201209e3f79b740337b7bdb521630fe/", 
     "http://www.t-online.de/contacts/2015/08/atlas.html/", "http://mgracetimber.ie/wp-content/themes/Banner/db/box/", 
     "http://zamartrade.com/cs/DHL/DHL%20_%20Tracking.htm/", "http://dunhamengineering.com/menu/Auto-loadgoogleDrive/Document.Index/", 
     "http://www.indiegogo.com/guide/forum/2014/09/forgot-password/", 
     "http://raetc.com/wp-admin/Service/clients/votre-compte/en-ligne/imp-rem.fr/", 
     "http://www.lidanhang.com/img/?https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&amp;hwjklxlamp;ssl=0&amp;dest/", 
     "http://www.sudaener.com/wp-includes/js/crop/dropbox/", "https://zeustracker.abuse.ch/blocklist.php/", 
     "https://zeustracker.abuse.ch/blocklist.php?download=hostsdeny/", 
     "https://zeustracker.abuse.ch/blocklist.php?download=iptablesblocklist/", 
     "https://zeustracker.abuse.ch/blocklist.php?download=snort/", 
     "https://zeustracker.abuse.ch/blocklist.php?download=squiddomain/" 
    ) 

我最初的嘗試是這樣的:

gsub('http://[^/]+/','/',sample1) 

然而,這不會有https://網址。一個合適的解決方案是在第三次出現"/"之前放下所有東西。我想知道如何使用regex來做到這一點,也想知道如何使用substring來做到這一點。

感謝

+1

也許'gsub('https?:// [^ /] + /','/',sample1)'? ('s?'說「s」0或1次)。 – Cath

+0

@Cath,是的,只要正則表達式就會這樣做。 – Sotos

+1

比這裏的正則表達式更進一步嗎? :)這是一個適合你的解決方案嗎? –

回答

4

這實在是明智的去gsub這裏因爲代碼是更清潔和更簡單。

如果你想第3 /前去除所有,使用

> gsub('^(?:[^/]*/){3}','/',sample1) 
[1] "/indirisu/docugard/"                    
[2] "/js/ggogle/a201209e3f79b740337b7bdb521630fe/"              
[3] "/contacts/2015/08/atlas.html/"                  
[4] "/wp-content/themes/Banner/db/box/"                 
[5] "/cs/DHL/DHL%20_%20Tracking.htm/"                 
[6] "/menu/Auto-loadgoogleDrive/Document.Index/"              
[7] "/guide/forum/2014/09/forgot-password/"                
[8] "/wp-admin/Service/clients/votre-compte/en-ligne/imp-rem.fr/"          
[9] "/img/?https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&amp;hwjklxlamp;ssl=0&amp;dest/" 
[10] "/wp-includes/js/crop/dropbox/"                  
[11] "/blocklist.php/"                     
[12] "/blocklist.php?download=hostsdeny/"                
[13] "/blocklist.php?download=iptablesblocklist/"              
[14] "/blocklist.php?download=snort/"                 
[15] "/blocklist.php?download=squiddomain/" 

^(?:[^/]*/){3}比賽:

  • ^ - 字符串的開始
  • (?:[^/]*/){3} - 恰好出現3次的:
    • [^/]* - 零個或多個字符/
    • / - 字面/字符。

Cath suggests更精確的您正則表達式的修復,但也許,你想在一開始的字符串的開頭添加^只匹配:

gsub('^https?://[^/]+/','/',sample1) 
    ^ ^

?(貪婪)量詞意味着一次或零次出現,因此在http後可以選擇s。它與gsub('^(https|http)://[^/]+/','/',sample1)相同(但效率更高)。

您可能還想讓您的正則表達式不區分大小寫,請添加ignore.case = TRUE

相關問題