Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用grepl()匹配句子中的两个连续单词(或者:如何在grepl()中使用通配符)?_R_Grepl - Fatal编程技术网

在R中使用grepl()匹配句子中的两个连续单词(或者:如何在grepl()中使用通配符)?

在R中使用grepl()匹配句子中的两个连续单词(或者:如何在grepl()中使用通配符)?,r,grepl,R,Grepl,假设我想在一个句子中匹配两个连续的单词,但明确地不匹配可能仍然包含这两个单词但不是一个接一个的其他句子 mydata <- data.frame(text=c("I like pizza, and a read a novel.", "I like novels.")) …我得到了“[1]真-真”,而我需要的是“假-真”,因为第一句中的“喜欢”并不是指“小说” 现在,这可能是一个不好的例子,因为我可以简单地搜索“Like novel.*”,而不使用通配符作为第一个单词,但进一步假设我也需

假设我想在一个句子中匹配两个连续的单词,但明确地不匹配可能仍然包含这两个单词但不是一个接一个的其他句子

mydata <- data.frame(text=c("I like pizza, and a read a novel.", "I like novels."))
…我得到了“[1]真-真”,而我需要的是“假-真”,因为第一句中的“喜欢”并不是指“小说”

现在,这可能是一个不好的例子,因为我可以简单地搜索“Like novel.*”,而不使用通配符作为第一个单词,但进一步假设我也需要使用通配符作为两个单词中的第一个

并与此相关联:在一个句子中,一个单词与一个通配符在一个词中如何匹配?

例如:

mydata<-data.frame(text=c("xxx abc xxx", "xxx azc xxx", "xxx a bc xxx"))

如果单词是连续的

grepl("like\\b \\bnovel", mydata$text, perl=TRUE, ignore.case=TRUE)
#[1] FALSE  TRUE
对于第二种情况,我们可以在开头和结尾使用单词边界(
\\b

grepl("\\ba\\w+c\\b", mydata$text, perl = TRUE, ignore.case = TRUE)
#[1]  TRUE  TRUE FALSE

这里要匹配的模式是单词边界(
\\b
)后跟字符“a”,一个或多个字符(
\\w+
)和“c”后跟单词边界(
\\b

谢谢,这就成功了!那么“\\w+\”代表一个单词中任意数量的字符?我如何指定“a”和“b”之间可以有任何东西,甚至是一个数字?我可以用
*
*?
来做这个吗?您知道关于如何指定与grepl匹配的条件的任何备忘单吗?grep/grepl文档PDF在这方面没有特别的帮助…@FabianHabersack您可以使用
\\ba[A-Za-z0-9]+c\\b
\\ba[^]+c\\b
(不是space@FabianHabersack最好是检查一下是否对regex@FabianHabersack
“like\\b\\b小说”
=“like novel”。
e
与空格和空格以及
n
之间的单词边界是隐式的。
\w
也匹配数字和
\u
。@FabianHabersack它对我来说不匹配
grepl(\\ba\\w+c\\b”,“xxx ac xxx”,perl=TRUE,ignore.case=TRUE)#[1]FALSE
grepl("like\\b \\bnovel", mydata$text, perl=TRUE, ignore.case=TRUE)
#[1] FALSE  TRUE
grepl("\\ba\\w+c\\b", mydata$text, perl = TRUE, ignore.case = TRUE)
#[1]  TRUE  TRUE FALSE