R 如何在正则表达式中使用逻辑运算符包含多个负的前向和后向条件
我需要将所有出现“dog”的字符串转换为“cat”,除非字符串是“browndog jumps up”或“dog barks looking”,在这种情况下,它们应该保持不变 我试着用消极的前看和后看 这是我的例子R 如何在正则表达式中使用逻辑运算符包含多个负的前向和后向条件,r,R,我需要将所有出现“dog”的字符串转换为“cat”,除非字符串是“browndog jumps up”或“dog barks looking”,在这种情况下,它们应该保持不变 我试着用消极的前看和后看 这是我的例子 str = c("brown dog", "brown dog jumps up", "dog jumps up", "dog barks loudly", "dog ran out") 预期结果是: CAT, brown dog jumps up, CAT, dog barks
str = c("brown dog", "brown dog jumps up", "dog jumps up", "dog barks loudly", "dog ran out")
预期结果是:
CAT, brown dog jumps up, CAT, dog barks loudly, CAT
我在第一个条件下尝试了这个方法,但它似乎在非此即彼的基础上起作用,即前面没有“brown”或后面没有“jumps up”。正则表达式是否按照三个条件(brown/dog/jumps up)的顺序起作用
gsub('.*?
gsub('.*(为什么不检查“dog”
是否出现,以及字符串是否出现,并将其更改为“CAT”
我们可以在单个grep
中使用invert=TRUE
str[grep("(brown dog jumps up)|(dog barks loudly)", str, invert = TRUE)] <- "CAT"
str
#[1] "CAT" "brown dog jumps up" "CAT" "dog barks loudly" "CAT"
str[grep((棕色的狗跳起来)|(狗大声叫)”,str,invert=TRUE)]谢谢@akrun,但这会将所有不带“dog”的字符串也改为“CAT”。我需要它们保持不变。
gsub('.*(?<!brown )dog.*|.*dog(?! jumps up).*', "CAT", str, perl = TRUE)
gsub('.*(?<!brown )dog.*|.*dog(?! jumps up).*|.*dog(?! barks loudly).*', "CAT", str, perl = TRUE)
strings <- c('dog barks loudly', 'brown dog jumps up')
str[grepl('dog', str) & (!str %in% strings)] <- "CAT"
str
#[1] "CAT" "brown dog jumps up" "CAT" "dog barks loudly" "CAT"
strings <- paste0(c('dog barks loudly', 'brown dog jumps up'), collapse = "|")
str[grepl('dog', str) & !grepl(strings, str)] <- "CAT"
str[grep("(brown dog jumps up)|(dog barks loudly)", str, invert = TRUE)] <- "CAT"
str
#[1] "CAT" "brown dog jumps up" "CAT" "dog barks loudly" "CAT"