是否可以在 grepl() 中使用 AND 运算符?

Posted

技术标签:

【中文标题】是否可以在 grepl() 中使用 AND 运算符?【英文标题】:Is it possible to use an AND operator in grepl()? 【发布时间】:2018-01-04 14:24:43 【问题描述】:

我想搜索以55 开头的任何内容以及包含Roof(区分大小写,适合好奇的人)的任何内容。

到目前为止,我一直没有成功,因为我似乎只能使用OR 运算符:

grepl("*^55|*Roof", dataset$longname)

最终,我想实现这样的目标:

grepl("*^55&&*Roof", dataset$longname)

grepl("*^55&*Roof", dataset$longname)

(显然,这些都不起作用 - 它们仅用于说明。)

我希望我的结果显示以55 开头并且在其中任何位置包含单词Roof 的任何内容。

例如,我希望grepl() 函数能够获取这两个结果:

55 - Roof Structure

55-Wall to Roof

是否有可以与grepl() 一起使用的AND 运算符?

【问题讨论】:

你可能想看看this question r- grepl to find multiple strings exists的可能重复 【参考方案1】:

搜索同时包含“a”和“b”的字符串

grepl("a", x) & grepl("b", x)

grepl("a.*b|b.*a", x)

如果我们知道这两个部分的顺序,那么我们可以省略最后一个grepl 的两半之一。例如,对于问题中的查询,这足以找到以 55 开头并包含 Roof 的字符串

grepl("^55.*Roof", x)

【讨论】:

完美!第二个选项最适合我,因为我喜欢让我的代码尽可能的简洁明了。我选择了:grepl("*^55.*Roof", dataset$longname) 谢谢。 是否可以包含多个ANDs,或者您的第一个示例就是这样?比如我可以grepl("*55.*Roof.*TOS", dataset$longname)吗?我试过了,它没有返回任何结果,所以我猜不是。 如果您知道可以使用的顺序,请使用a.*b.*c,但如果不知道,您可以使用多个grepl 命令grepl(...) & grepl(...) & grepl(...),或者使用a.*b.*c|a.*c.*b|b.*a.*c|b.*a.*c|c.*a.*b|c.*b.*a 我明白了,所以grepl() 是线性工作的,它只按顺序查找搜索词,对吗? @SnookerFan:关于第三种选择,使用正向预测,请参阅:***.com/questions/44152970/…。【参考方案2】:

我正在重新发布@Psidom 的答案,因为他的答案已被删除,但可以扩展到 n 个 AND 子句。如果@Psidom 取消删除他的回复,我将删除这个(我投票取消删除),但觉得答案对其他搜索者很重要:

s <- c("55 - Roof Structure", "55-Wall to Roof", 'd 55 Roof')
grepl("(?=.*^55)^Roof", s, perl = TRUE)
## [1]  TRUE  TRUE FALSE

## 2 AND clauses
grepl("^(?=.*^55)(?=.*Roof)(?=.*Wall)", s, perl = TRUE)
## [1]  FALSE  TRUE FALSE

【讨论】:

以上是关于是否可以在 grepl() 中使用 AND 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

R语言学习14-stringr包

使用 grepl 在 R 中提取子字符串

使用 grepl 在 R 中获取匹配的字符串

R语言应用substr函数和substring函数抽取(extract)删除(Remove)替换匹配(Match)特定的字符串并对比两个函数的异同grepl检查子字符串是否存在于字符串中

grepl 用于 dplyr sql 表?

与 grepl 一起 fread