【发布时间】:2016-04-26 16:14:30
【问题描述】:
我正在尝试为包含“dog”但不包含“cat”的句子创建规则。我希望函数返回 FALSE,因为字符串同时包含“dog”和“cat”。
使用否定:
grepl("cat.*[^dog]", "asdfasdfasdf cat adsfafds dog", perl=T)
使用负前瞻:
grepl("cat.*(?!dog)", "asdfasdfasdf cat adsfafds dog", perl=T)
使用stringr包中的str_detect函数
require(stringr)
str_detect("asdfasdfasdf cat adsfafds dog", "cat.*(?!dog|$)")
这三个方法都返回 true。
【问题讨论】:
-
您意识到
cat.*[^dog]将在字符串cat foobarbaz god或cat foobarbaz odg等上失败。原因是[^]将匹配任何字符,但那些里面,除了里面的那个以外没有任何词 -
此外,它们应该返回 true。原因是如果 Negative Lookahead 匹配,它们将是真的。如果您希望它们是假的,只需删除否定并使其成为正常组。
-
@ Druzion,你的意思是
grepl("cat.*(?=dog)", "asdfasdfasdf cat adsfafds dog", perl=T)?好吧,这只是返回 true,因为它正在检查字符串中是否有 cat 和 dog。 -
没有。这是一个积极的前瞻,它将检查狗是否存在。使用负前瞻:
cat.*(?!dog)。我知道你已经这样做了,我只是想指出为什么第一种方法行不通。