首页 > 解决方案 > 如何在正则表达式中使用逻辑运算符包含多个负前瞻和后视条件

问题描述

我需要将所有出现“dog”的字符串转换为“cat”,除非字符串是“brown dog jumps up”或“dog barks loudly”,在这种情况下它们应该保持不变。

我尝试使用负前瞻和后瞻。

这是我的例子。

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

我在第一个条件下尝试了这个,但它似乎在非此即彼的基础上起作用,即前面没有“棕色”或后面没有“跳跃”。正则表达式是否不能按照三个条件的顺序工作(棕色/狗/跳起来)?

gsub('.*(?<!brown )dog(?! jumps up).*', "CAT", str, perl = TRUE)

以下正则表达式有效,但如果我使用“或”,为什么“棕色狗”和“狗跳起来”不保持不变?

gsub('.*(?<!brown )dog.*|.*dog(?! jumps up).*', "CAT", str, perl = TRUE)

在上述基础上,我添加了第三个模式,但这会将所有内容更改为“CAT”。

gsub('.*(?<!brown )dog.*|.*dog(?! jumps up).*|.*dog(?! barks loudly).*', "CAT", str, perl = TRUE)

为什么|此代码中的功能为 AND?我如何将除“棕色狗跳起来”和“狗大声吠叫”之外的所有内容更改为“猫”?

标签: r

解决方案


为什么不只检查发生"dog"和不发生strings并将它们更改为"CAT"

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而不是完全匹配,我们可以这样做

strings <- paste0(c('dog barks loudly', 'brown dog jumps up'), collapse = "|")
str[grepl('dog', str) & !grepl(strings, str)] <- "CAT"

推荐阅读