如何将多个必要的模式传递给str_subset?

时间:2019-05-16 03:38:03

标签: r regex stringr

我正在尝试使用stringr :: str_subset函数在字符向量中查找没有特定顺序匹配两个单词的元素,而不仅仅是其中一个单词。换句话说,我要寻找的是交集,而不是两个单词的并集。

我尝试使用“或”(|)运算符,但这仅给我两个单词之一,并返回太多结果。我还尝试仅传递带有两个单词的字符向量作为模式参数。这只会返回“较长的对象长度不是较短的对象长度的倍数”的错误,并且仅返回与两个单词中的第二个单词匹配的值。

character_vector <- c("abc ghi jkl mno def", "pqr abc def", "abc jkl pqr")
pattern <- c("def", "pqr")

str_subset(character_vector, pattern)

我正在寻找仅返回字符向量的第二个元素的模式,即“ pqr abc def”。

4 个答案:

答案 0 :(得分:1)

一个选项是str_detect。循环遍历“模式”,检查两个“模式”元素是否都与“ character_vector”(&)匹配,使用逻辑矢量extract从“ character_vector”中获取元素

library(tidyverse)
map(pattern, str_detect, string = character_vector) %>%
    reduce(`&`) %>% 
    magrittr::extract(character_vector, .)
#[1] "pqr abc def"

或使用str_subset

map(pattern, str_subset, string = character_vector) %>% 
         reduce(intersect)
#[1] "pqr abc def"

答案 1 :(得分:1)

您可以使用正则表达式在没有循环的情况下使用纯R代码。代码是这样的:

character_vector[grepl(paste0("(?=.*",pattern,")",collapse = ""), character_vector, perl = TRUE)]

grepl将找到完全填充paste0内的正则表达式和条件的字符的位置。

答案 2 :(得分:1)

寻找相交时,可以使用函数intersect()并明确显示要寻找的2种图案

pattern_1 <- 'pqr'

pattern_2 <- 'def'

intersect( str_subset(character_vector, pattern_1), str_subset(character_vector, pattern_2) )

答案 3 :(得分:0)

这行得通吗?

character_vector %>% purrr::reduce(pattern, str_subset, .init = . )

[1] "pqr abc def"