查找特殊字符的第三次出现并在 R 中删除之前的所有内容

Posted

技术标签:

【中文标题】查找特殊字符的第三次出现并在 R 中删除之前的所有内容【英文标题】:Find third occurrence of a special character and drop everything before that in R 【发布时间】:2016-05-07 09:55:27 【问题描述】:

我有这个包含 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。一个合适的解决方案是在第三次出现"/" 之前删除所有内容。我想知道如何使用 regex 来做到这一点,以及是否有办法使用 substring 来做到这一点。

谢谢

【问题讨论】:

也许是gsub('https?://[^/]+/','/',sample1)? (s? 说“s”0 或 1 次)。 @Cath,是的,就正则表达式而言,这将做到这一点。 还有什么比这里的正则表达式更进一步? :) 这是适合您的解决方案吗? 嗯,我想知道substring 是否也会这样做 还有另一种使用 strsplit 的方法,但正如您所见,gsub 更明智:sapply(sample1, function(s) paste0(c('', unlist(strsplit(s, '/'))[-(1:3)]), collapse='/'), USE.NAMES=FALSE) 【参考方案1】:

这里真的建议使用gsub,因为代码更简洁明了。

如果要删除第三个 / 之前的所有内容,请使用

> 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

【讨论】:

以上是关于查找特殊字符的第三次出现并在 R 中删除之前的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

从R中的字符串中删除所有特殊字符?

如何在字符串中查找第 n 个出现的字符?

vim怎么替换每行出现的第一个指定字符

删除R中字符串中第一个大写字母实例之前的字符

查找文件中所有出现的字符串并在 Perl 中打印其行号

二周第三次课(1月31日)