繁体   English   中英

使用grepl从模式列表中查找匹配的模式

[英]Find matching patterns from list of patterns using grepl

我使用grepl检查一个字符串是否包含一组模式中的任何模式(我使用'|'来分隔模式)。 反向搜索没有帮助。 如何识别匹配的模式集?

附加信息:这可以通过编写循环来解决,但由于我的集合具有> 100,000个字符串,因此非常耗时。 可以优化吗?

例如:让字符串为a <- "Hello"

pattern <- c("ll", "lo", "hl")

pattern1 <- paste(pattern, collapse="|") # "ll|lo|hl"

grepl(a, pattern=pattern1) # returns TRUE

grepl(pattern, pattern=a) # returns FALSE 'n' times - n is 3 here

您正在寻找str_detect从包stringr

library(stringr)

str_detect(a, pattern)
#[1]  TRUE  TRUE FALSE

如果您有多个字符串,如a = c('hello','hola','plouf')您可以执行以下操作:

lapply(a, function(u) pattern[str_detect(u, pattern)])

您也可以使用带有超前表达式的基本R (?=) ,因为模式重叠。 使用gregexpr您可以将每个分组模式的匹配位置提取为矩阵。

## changed your string so the second pattern matches twice
a <- "Hellolo"
pattern <- c("ll", "lo", "hl")
pattern1 <- sprintf("(?=(%s))", paste(pattern, collapse=")|(")) #  "(?=(ll)|(lo)|(hl))"

attr(gregexpr(pattern1, a, perl=T)[[1]], "capture.start")
# [1,] 3 0 0
# [2,] 0 4 0
# [3,] 0 6 0

矩阵的每列对应于图案,因此图案2匹配测试串中的位置4和6,图案1匹配位置3,依此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM