正则表达式包含不在列表中的字符串

时间:2016-09-01 19:25:35

标签: regex r

在R中,如何检查字符串是否包含不在列表中的子字符串?例如,假设您有字符串向量fruits <- c('apple,pear,orange', 'apple,pear', 'apple,banana', 'apple'),并且您需要一个函数来告诉您特定元素是否具有不是苹果或梨的水果。在示例中,它将类似于

fruits <- c('apple,pear,orange', 'apple,pear', 
            'apple,banana', 'apple', 'pear,apple')

other_fruits(fruits)
# [1] TRUE  FALSE TRUE  FALSE FALSE

2 个答案:

答案 0 :(得分:2)

如果您的字符串始终包含以逗号分隔的水果名称,则可以在没有正则表达式的情况下执行此操作,如下例所示,尽管下面的方法也可以修改为使用正则表达式。

fruits <- c('apple,pear,orange', 'apple,pear', 
            'apple,banana', 'apple', 'pear,apple')

sapply(strsplit(fruits,","), function(x) !all(x %in% c("apple","pear")))
[1]  TRUE FALSE  TRUE FALSE FALSE

或者,一般来说:

other_fruits = function(string, fruit_check) {
  sapply(strsplit(string,","), function(x) !all(x %in% fruit_check))
}

other_fruits(fruits, c("apple","pear"))

或者说,你想要回归选择水果以外的水果:

other_fruits = function(string, fruit_check) {
  lapply(strsplit(string,","), function(x) {
    if (all(x %in% fruit_check)) NA else x[!(x %in% fruit_check)]
  })
}

other_fruits(fruits, "apple")   
[[1]]
[1] "pear"   "orange"

[[2]]
[1] "pear"

[[3]]
[1] "banana"

[[4]]
[1] NA

[[5]]
[1] "pear"

答案 1 :(得分:0)

您可以创建索引以查看水果的显示位置:

fruits <- c('apple,pear,orange', 'apple,pear', 
            'apple,banana', 'apple', 'pear,apple', 'mango')


str <- unique(unlist(strsplit(fruits,",")))
dat <- sapply(str, grepl, fruits)
dat

     apple  pear orange banana mango
[1,]  TRUE  TRUE   TRUE  FALSE FALSE
[2,]  TRUE  TRUE  FALSE  FALSE FALSE
[3,]  TRUE FALSE  FALSE   TRUE FALSE
[4,]  TRUE FALSE  FALSE  FALSE FALSE
[5,]  TRUE  TRUE  FALSE  FALSE FALSE
[6,] FALSE FALSE  FALSE  FALSE  TRUE

计算不同水果与苹果或梨的出现次数;

apply(dat[,3:ncol(dat)], 1, sum)

或者创建一个逻辑向量来指示其他成果的位置;

as.logical(apply(dat[,3:ncol(dat)], 1, sum))