我有 3 个词:x、y 和 z,从中可以构建两个复合词:xy 和 yz。
在自然出现的文本中,x、y 和 z 可以相互跟随。在第一种情况下,我有:
text="x-y z"
我想检测:“xy”而不是“y z”。如果我做:
v=c("x-y","y z")
vv=paste("\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)
我得到 c(TRUE,TRUE)。换句话说,grepl 没有捕捉到 y 已经通过单词内破折号链接到 x 的事实,因此,“y z”实际上并不存在于文本中。因此,在文本开头添加空格后,我使用了lookbehind:
text=paste("",text,sep=" ")
vv=paste("(?<= )\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)
这一次,我得到了我想要的:c(TRUE, FALSE)。现在,在第二种情况下,我有:
text="x y-z"
我想检测“yz”而不是“x y”。这次采用了一种具有前瞻性的对称方法,我尝试了:
text=paste(text,"",sep=" ")
v=c("x y","y-z")
vv=paste("(?= )\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)
但是这次我得到了 c(FALSE,FALSE) 而不是 c(FALSE,TRUE) ,正如我所期望的那样。第一个位置的 FALSE 是预期的(前瞻检测到 y 之后存在单词内破折号并阻止与“x y”匹配)。但我真的不明白是什么阻止了与“yz”的匹配。
非常感谢您的帮助,