是否可以在 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)
谢谢。
是否可以包含多个AND
s,或者您的第一个示例就是这样?比如我可以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语言应用substr函数和substring函数抽取(extract)删除(Remove)替换匹配(Match)特定的字符串并对比两个函数的异同grepl检查子字符串是否存在于字符串中