在正则表达式向量中找到字符串的匹配项

时间:2019-04-11 16:15:08

标签: r

假设我有一个字符向量

vals <- c("hello","goodbye","junk")

和正则表达式目标向量

targets <- c("(hello|goodbye)","^j","other")

(我愿意规定vals中的每个元素都与targets中的一个元素完全匹配)。是否存在一种现有的,高效/紧凑/矢量化的方法来找到valstargets中每个元素的匹配索引? (match不起作用:它与字符串表而不是正则表达式匹配。)因此,本示例的期望输出为c(1,1,2)。欢迎使用Base-R或tidyverse / stringr解决方案。

3 个答案:

答案 0 :(得分:2)

一种方法是将list的名称和序列分别设置为stack和两列data.frame。 NULL元素将被stack删除。现在,我们提取第二列以获得list索引

as.integer(stack(setNames(m, seq_along(m)))[,2])
#[1] 1 1 2

注意:此处m是@ {BenBolker的list的索引输出,来自grep的输出


或使用tidyverse

library(tidyverse)
crossing(targets, vals) %>%
    mutate(ind = group_indices(., targets)) %>%
    filter(str_detect(vals, targets)) %>%
    pull(ind)
#[1] 1 1 2

答案 1 :(得分:1)

我想到的最好方法是:反转匹配,即:遍历目标,然后将匹配项填充到与值对应的向量中。

## find positions in `vals` that match each target
m <- lapply(targets,grep,x=vals)
## set up response vector
res <- rep(NA,length(vals))
## fill in matching positions for each target
for (i in seq_along(m)) {
    res[m[[i]]] <- i
}

答案 2 :(得分:0)

使用str_detect中的stringr,循环遍历每个值以找到目标索引。

library(stringr)

# Data
vals <- c("hello","goodbye","junk")
targets <- c("(hello|goodbye)","^j","other")

# create empty vector to assign matched value later
v  <- c()

for (i in 1:length(vals)){

  # value to be looked up against target
  stg_i <- vals[i]

  # min to get first matched target
  stg_v <- min(which(str_detect(stg_i, targets)))

  # update the value in vector with matched one
  v[i] <- stg_v

}

v
[1] 1 1 2