我有一个不同路径的向量,例如
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"