【问题标题】:Using grepl() in R to match two consecutive words in a sentence (or: How to use wildcards in grepl())?在 R 中使用 grepl() 匹配一个句子中的两个连续单词(或:如何在 grepl() 中使用通配符)?
【发布时间】:2019-07-13 17:07:12
【问题描述】:

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

mydata <- data.frame(text=c("I like pizza, and a read a novel.", "I like novels."))

所以,如果我这样做......

grepl("lik.*? novel.*?", mydata$text, perl=T, ignore.case=T)

...我得到“[1] TRUE TRUE”,而我需要的是“FALSE TRUE”,因为第一句中的“like”不是指“小说”。

现在,这可能是一个不好的例子,因为我可以简单地搜索“喜欢小说。*?”第一个单词没有通配符,但进一步假设我也需要对这两个单词中的第一个使用这个通配符。

与此相关:如何将句子中的单词与所述单词中间的通配符匹配?

例子:

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

我想匹配以“a”开头和以“c”结尾的单词,无论它们之间有什么,但条件是这必须是一个单词。目前,即使是第三行,我也得到“TRUE”,而我需要的是前两行的匹配,而不是第三行的匹配:

grepl("a.*?c", mydata$text, perl=T, ignore.case=T)

【问题讨论】:

    标签: r grepl


    【解决方案1】:

    如果单词是连续的

    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(不是空格
    • @FabianHabersack 检查regular-expressions.info/tutorial.html 可能会更好地了解正则表达式
    • @FabianHabersack "like\\b \\bnovel" = "like novel"e 与空格和空格和n 之间的字边界是隐含的。 \w 匹配数字,_ 也匹配。
    • @FabianHabersack 我不匹配grepl("\\ba\\w+c\\b","xxx ac xxx", perl = TRUE, ignore.case = TRUE)# [1] FALSE
    猜你喜欢
    • 2011-09-25
    • 2013-03-16
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多