如何在grepl中使用“和”?

时间:2018-02-26 15:42:03

标签: r regex

这就是我所拥有的:

f=5.20
y=168.9850
dat=c("dat.txt","dat_5.20.txt","data_5.20_168.9850.txt")
Filter(function(x) grepl(f, x), dat)
# [1] "dat_5.20.txt"           "data_5.20_168.9850.txt"

我只需要获取f and y

获得的那个

如何在grepl中使用f和y?

期望的结果是:

"data_5.20_168.9850.txt"

3 个答案:

答案 0 :(得分:2)

一种纯正则表达式的方法是使用两个前瞻断言,它们独立地检查每个数字字符串是否存在:

f <- "5\\.20"
y <- "168\\.9850"
dat <- c("dat.txt","dat_5.20.txt","data_5.20_168.9850.txt")

grepl(paste0("(?=.*", f, ")(?=.*", y, ")"), dat, perl=TRUE)

[1] FALSE FALSE  TRUE

此处使用的模式为(?=.*5\.20)(?=.*168\.9850)

答案 1 :(得分:2)

我想如果你有一长串搜索字符串,而且你不想输入你能做的所有事情:

dat[Reduce("&", lapply(c(f,y), function(x, dat) grepl(x, dat), dat = dat))]

然而,您可能也可以使用@ TimBiegeleisen的方法通过执行以下操作来解决所有问题:paste0("(?=.*", c(f,y), ")", collapse = "")并将结果用作搜索字符串。

答案 2 :(得分:1)

我们可以使用以下任何一种方法做两个grep:

grep(y, grep(f, dat, value = TRUE), value = TRUE)
## [1] "data_5.20_168.9850.txt"

dat[grepl(f, dat) & grepl(y, dat)]
## [1] "data_5.20_168.9850.txt"

dat[ intersect(grep(f, dat), grep(y, dat)) ]
## [1] "data_5.20_168.9850.txt"