在R中查找特定字符的第三个出现位置并删除该位置之前的所有内容

4
我有一个包含URL的样本向量。我的目标是获取URL的路径。
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:// 的 URL。一个可行的解决方案是将第三个 "/" 之前的内容全部去除。我想知道如何使用 正则表达式 实现这一点,是否也可以使用 子字符串 来实现。

谢谢


1
也许可以使用 gsub('https?://[^/]+/','/',sample1) 代替?(s? 表示 "s" 出现 0 或 1 次)。 - Cath
@Cath,是的,就正则表达式而言,这样做可以。 - Sotos
1
这里有比正则表达式更进一步的内容吗? :) 那个解决方案对你有效吗? - Wiktor Stribiżew
我在想如果使用“substring”是否也可以实现。 - Sotos
有另一种使用 strsplit 的方法,但是正如你所看到的,gsub 更加合理:sapply(sample1, function(s) paste0(c('', unlist(strsplit(s, '/'))[-(1:3)]), collapse='/'), USE.NAMES=FALSE) - cr3
1个回答

9

在这里使用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建议 更改你的正则表达式以更精准匹配,但也许你想在开头加上 ^ 以仅在字符串开始处匹配:

gsub('^https?://[^/]+/','/',sample1)
      ^     ^
?(贪婪)量词表示一个或零次出现,因此使http后面的s是可选的。它与gsub('^(https|http)://[^/]+/','/',sample1)相同(但更有效)。您还可以使您的正则表达式不区分大小写,加上ignore.case = TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接