使用 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
您正在从包裹 stringr
中寻找 str_detect
:
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,依此类推。
我使用 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
您正在从包裹 stringr
中寻找 str_detect
:
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,依此类推。