在两个可能的分隔符之一之前找到一个单词

时间:2012-10-02 16:17:14

标签: regex r

word:12335
anotherword:2323434
totallydifferentword/455
word/32

我需要使用基本R函数在:/之前获取字符串。我可以使用stringr执行此操作,但不希望向我的包添加另一个依赖项。单词可以具有可变数量的字符,但总是以(一个)分隔符结束。我不需要保留之后的内容。

4 个答案:

答案 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=.*?}
  • {=[:/].*?}匹配以:/开头的所有内容,并且由于我们没有=的生命,因此不会返回