如何根据字符串匹配过滤R中的字符串向量

And*_*ich 30 regex indexing r vector

我在R中有以下向量:

X <- c("mama.log", "papa.log", "mimo.png", "mentor.log")
Run Code Online (Sandbox Code Playgroud)

如何识别另一个仅包含以"m"开头并以".log"结尾的元素的向量?

koh*_*ske 55

你可以使用grepl正则表达式:

X[grepl("^m.*\\.log", X)]
Run Code Online (Sandbox Code Playgroud)

  • 由于 Andrey 要求使用一种模式来匹配 .log 中的字符串*结尾*,我相信这应该是 X[grepl("^m.*\\.log$", X)] (2认同)

G. *_*eck 24

试试这个:

grep("^m.*[.]log$", X, value = TRUE)
## [1] "mama.log"   "mentor.log"
Run Code Online (Sandbox Code Playgroud)

这种变化是使用glob而不是正则表达式:

grep(glob2rx("m*.log"), X, value = TRUE)
## [1] "mama.log"   "mentor.log"
Run Code Online (Sandbox Code Playgroud)

  • 我没听说过glob2rx,太好了! (2认同)

Ale*_*der 7

stringr包装上的文档说:

str_subset()是一个包装器x[str_detect(x, pattern)],相当于grep(pattern, x, value = TRUE)str_which()是一个包装器which(str_detect(x, pattern)),相当于grep(pattern, x)

因此,在您的情况下,使用tidyverse替代R 来完成任务的更优雅的方法如下。

library(tidyverse)

c("mama.log", "papa.log", "mimo.png", "mentor.log") %>% 
   str_subset(pattern = "^m.*\\.log")
Run Code Online (Sandbox Code Playgroud)

产生输出:

[1] "mama.log"   "mentor.log"
Run Code Online (Sandbox Code Playgroud)

  • 您只需要加载 `library(stringr)` 而不是整个 tidyverse 包。 (3认同)