使用PCRE在R中的正则表达式中多个匹配和多个排除

时间:2017-12-11 05:04:23

标签: r regex pcre

我对R中的正则表达式很新,我试图匹配包含一些模式和排除某些模式的字符串向量。我在stackoverflow上搜索,似乎没有问过类似的问题。这是要匹配的字符串mystring的向量。

mystring <- c("fhwjantdesd", "unwanted", "fdedsifrfed", "undesired", "sdsyessd", "yedsfd")

在此mystring中,我想弄清楚mystring是否包含6个&#34;想要&#34;的字母的任何排列。排除字符串&#34;想要&#34;。同样,包括&#34;期望&#34;的7个字母的任何排列。和#34;是&#34;排除字符串&#34;期望&#34;和&#34;是&#34;。

因此grepl(pattern, mystring, perl = TRUE)的预期输出应为:

[1] TRUE, FALSE, TRUE, FALSE, FALSE, TRUE

我想使用grepl的perl选项,这可以加快功能。有没有人能提供一些关于pattern的线索?你能解释一下这个模式的每个部分是什么意思我只是使用PCRE的首发。感谢

2 个答案:

答案 0 :(得分:1)

下面的代码会有一些限制。

grepl("(^((?!yes|wanted|desired).)*$)", mystring, perl=TRUE)

它只会排除上述字词。那是根据你的数据。

答案 1 :(得分:0)

您可以尝试这样

mystring <- c("fhwjantdesd", "unwanted", "fdedsifrfed", "undesired", "sdsyessd", "yedsfd")
Status <- NULL
str <- c("wanted", "desired", "yes")
index <- 1


for (i in mystring) {
  for (j in str) {
    char_length <- nchar(j)

    if (is.na(str_extract(string = i, pattern = j)) | str_extract(string = i, pattern = j) == F) {
      if (sum(unlist(strsplit(j, "")) %in% unlist(strsplit(i, ""))) >=  char_length) {
        Status[index] <- T
        break
      }
    }
  }

  if (is.na(Status[index])) {
    Status[index] = F
  }

  index <- index + 1
}

Status

  > Status
[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE