查找特殊字符的第三次出现并在 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&hwjklxlamp;ssl=0&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&hwjklxlamp;ssl=0&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 中删除之前的所有内容的主要内容,如果未能解决你的问题,请参考以下文章