R grep:将一个字符串与多个模式匹配

时间:2012-03-02 17:35:57

标签: regex r

在R中,grep通常匹配多个字符串的向量与一个正则表达式。

问:是否有可能将单个字符串与多个正则表达式匹配? (没有循环遍历每个单一的正则表达式模式)?

一些背景知识:

我有7000多个关键字作为几个类别的指标。我无法更改该关键字字典。字典具有以下结构(第1列中的关键字,数字表示这些关键字所属的类别):

ab  10  37  41
abbrach*    38
abbreche    39
abbrich*    39
abend*  37
abendessen* 60  63
aber    20  23  45
abermals    37

用“|”连接这么多关键字是不可行的方式(我不知道哪个关键字产生了命中)。 此外,只是反转“模式”和“字符串”不起作用,因为模式有截断,而不是相反的方式。

[related question,其他编程语言]

3 个答案:

答案 0 :(得分:31)

如何在关键字矢量上应用regexpr函数?

keywords <- c("dog", "cat", "bird")

strings <- c("Do you have a dog?", "My cat ate by bird.", "Let's get icecream!")

sapply(keywords, regexpr, strings, ignore.case=TRUE)

     dog cat bird
[1,]  15  -1   -1
[2,]  -1   4   15
[3,]  -1  -1   -1

    sapply(keywords, regexpr, strings[1], ignore.case=TRUE)

 dog  cat bird 
  15   -1   -1 

返回的值是匹配中第一个字符的位置,-1表示不匹配。

如果匹配的位置无关紧要,请改为使用grepl

sapply(keywords, grepl, strings, ignore.case=TRUE)

       dog   cat  bird
[1,]  TRUE FALSE FALSE
[2,] FALSE  TRUE  TRUE
[3,] FALSE FALSE FALSE

更新:即使有大量关键字,我的系统运行速度相对较快:

# Available on most *nix systems
words <- scan("/usr/share/dict/words", what="")
length(words)
[1] 234936

system.time(matches <- sapply(words, grepl, strings, ignore.case=TRUE))

   user  system elapsed 
  7.495   0.155   7.596 

dim(matches)
[1]      3 234936

答案 1 :(得分:2)

要展开other answer,要将sapply()输出转换为有用的逻辑向量,您需要进一步使用apply()步骤。

keywords <- c("dog", "cat", "bird")
strings <- c("Do you have a dog?", "My cat ate by bird.", "Let's get icecream!")
(matches <- sapply(keywords, grepl, strings, ignore.case=TRUE))
#        dog   cat  bird
# [1,]  TRUE FALSE FALSE
# [2,] FALSE  TRUE  TRUE
# [3,] FALSE FALSE FALSE

要知道哪些字符串包含任何关键字(模式):

apply(matches, 1, any)
# [1]  TRUE  TRUE FALSE

要知道在提供的字符串中匹配了哪些关键字(模式):

apply(matches, 2, any)
#  dog  cat bird 
# TRUE TRUE TRUE

答案 2 :(得分:1)

re2r包可以匹配多个模式(并行)。最小示例:

# compile patterns
re <- re2r::re2(keywords)
# match strings
re2r::re2_detect(strings, re, parallel = TRUE)