如何设置与字符串总长度相关的正则表达式?

时间:2015-06-29 18:40:21

标签: regex r

我有一个字符串列表:

> head(g_patterns_clean_strings)
[[1]]
[1] "1FAFA"

[[2]]
[1] "FA,TRFA"

[[3]]
[1] "FAEX"

我试图识别这些字符串中的特定模式,如下:

library(devtools)
g_patterns_clean <- source_gist("164f798524fd6904236a")[[1]]
g_patterns_clean_strings <- source_gist("af70a76691aacf05c1bb")[[1]]

FA_logic_vector <- grepl(g_patterns_clean_strings, pattern = "(FA)+")
FA_cluster <- subset(g_patterns_clean, FA_logic_vector)

我们现在要说检查字符串,其中"FA"占字符串总长度的X%(例如"FA"占每个字符串中字符的25%将匹配)。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:2)

以下是使用stringr和来自%>%的管道运算符magrittr的方法。提供的函数采用字符串,模式和最小比例的向量,并返回与输入相同长度的逻辑向量,指示模式是否至少构成该比例。

library("magrittr")
library("stringr")

checkPatternProportion <- function(strings, pattern, proportion) {
  strings %>%
    str_extract_all(pattern) %>%
    lapply(paste, collapse = "") %>%
    {nchar(.) / nchar(strings) >= proportion}
}

用法:

set.seed(123)
myStrings <- replicate(100, c("AB", "FA", "GE", "DE") %>%
  sample(sample(1:8), replace = TRUE) %>%
  paste(collapse = ""))

head(myStrings, 10)
#  [1] "GEFADE"           "DEDEGEGE"         "DEGEDEABFADEABFA" "FAFA"             "DEDEFAGEABFAFA"  
#  [6] "GEABFAABFAGEFA"   "DE"               "DEABFAGEGEFAFADE" "ABDEGEAB"         "FADEABABAB"      

matches <- checkPatternProportion(myStrings, "FA", 0.25)
head(matches, 10)
# [1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE