word:12335
anotherword:2323434
totallydifferentword/455
word/32
我需要使用基本R函数在:
或/
之前获取字符串。我可以使用stringr
执行此操作,但不希望向我的包添加另一个依赖项。单词可以具有可变数量的字符,但总是以(一个)分隔符结束。我不需要保留之后的内容。
答案 0 :(得分:3)
也许试试:
x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
lapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a list
sapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a string
有gsub
的正则表达式解决方案也可以使用,但在我遇到类似问题的经验中,strsplit
不那么雄辩但速度更快。
我认为这个正则表达式也会起作用:
gsub("([a-z]+)([/|:])([0-9]+)", "\\1", x)
在这种情况下,gsub更快:
Unit: microseconds
expr min lq median uq max
1 GSUB() 19.127 21.460 22.392 23.792 106.362
2 STRSPLIT() 46.650 50.849 53.182 54.581 854.162
答案 1 :(得分:2)
像这样的东西可以在Ruby中发挥作用 http://rubular.com/r/PzVQVIpKPq
^(\w+)(?:[:\/])
从字符串的正面开始,抓取任何单词字符并捕获它们,直到您到达非捕获/
或:
答案 2 :(得分:0)
This regex seems to work。你能在R中使用它吗?
答案 3 :(得分:0)
您可以使用软件包 unglue :
library(unglue)
x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
unglue_vec(x, "{res}{=[:/].*?}")
#> [1] "word" "anotherword" "totallydifferentword"
#> [4] "word"
由reprex package(v0.3.0)于2019-10-08创建
{res}
匹配任何内容并将被返回,等效于{res=.*?}
{=[:/].*?}
匹配以:
或/
开头的所有内容,并且由于我们没有=
的生命,因此不会返回