使用正则表达式筛选 R 中只有一个"/"的路径



我有一个不同路径的向量,例如

levs<-c( "20200507-30g_25d" , "20200507-30g_25d/ggg" , "20200507-30g_25d/grn", "20200507-30g_25d/ylw", "ggg" , "grn", "tre_livelli", "tre_livelli/20200507-30g_25d", "tre_livelli/20200507-30g_25d/ggg", "tre_livelli/20200507-30g_25d/grn", "tre_livelli/20200507-30g_25d/ylw" , "ylw" )

实际上是一个列表的输出。

我只想识别只有一个子文件夹的路径(即"20200507-30g_25d/ggg", "20200507-30g_25d/grn" "20200507-30g_25d/ylw")。

我想过滤向量,只找到那些只有一个"/"然后将this与有多个"/"去掉部分路径

我尝试使用正则表达式,如:

rep(levs,pattern='/{1}', value=T)

但是我得到了这个:

"20200507-30g_25d/ggg"             "20200507-30g_25d/grn"             "20200507-30g_25d/ylw"             "tre_livelli/20200507-30g_25d"     "tre_livelli/20200507-30g_25d/ggg" "tre_livelli/20200507-30g_25d/grn" "tre_livelli/20200507-30g_25d/ylw"

你知道该怎么做吗?

/{1}是一个等于/的正则表达式,只匹配字符串中任何位置的/,其中可以有多个/。请查看regex标签页面:

使用{1}作为单次重复量词是无害的,但从来没有用。这基本上是缺乏经验和/或困惑的表现。

h{1}t{1}t{1}p{1}与更简单的表达式http(或ht{2}p)匹配相同的字符串,但正如您所看到的,重复的{1}只会使其更难阅读。

可以使用

grep(levs, pattern="^[^/]+/[^/]+$", value=TRUE)
# => [1] "20200507-30g_25d/ggg"         "20200507-30g_25d/grn"         "20200507-30g_25d/ylw"         "tre_livelli/20200507-30g_25d"

查看regex演示:

  • ^-匹配字符串
  • 的开头
  • [^/]+-/以外的一个或多个字符
  • /- a/char
  • [^/]+-/以外的一个或多个字符
  • $-字符串结束

注意:如果字符串中唯一一个/的前后部分可以为空,则将+替换为*:^[^/]*/[^/]*$.

str_count的一个选项,用于计算/的实例数量

library(stringr)
levs[str_count(levs, "/") == 1 ]

-ouptut

[1] "20200507-30g_25d/ggg"         "20200507-30g_25d/grn" 
[3] "20200507-30g_25d/ylw"         "tre_livelli/20200507-30g_25d"

相关内容

最新更新