首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找字符串中是否有多个字符

查找字符串中是否有多个字符
EN

Stack Overflow用户
提问于 2019-07-24 22:55:32
回答 3查看 50关注 0票数 0

我有一个这样的字符串

代码语言:javascript
复制
fileName <- 'tyi_myRef_2019_2020'

我想检查fileName中是否存在以下任何字符,如果存在,则将其分配给一个对象。

代码语言:javascript
复制
myChar <- c('myPer','myRef','myYe','myQr')

我这样做的方式是:

代码语言:javascript
复制
if(grepl('myPer', fileName)) {myObject <- 'myPer'}
if(grepl('myRef', fileName)) {myObject <- 'myRef'}
if(grepl('myYe', fileName)) {myObject <- 'myYe'}
if(grepl('myQr', fileName)) {myObject <- 'myQr'}

myObject
"myRef"

有没有更短的方法来做这件事?

EN

回答 3

Stack Overflow用户

发布于 2019-07-24 22:58:59

您可以像这样使用sapply

代码语言:javascript
复制
myObject <- myChar[sapply(myChar, function(x) {grepl(x, fileName)})]
myObject
#[1] "myRef"

或者就像@g-grothendieck建议的那样更短:

代码语言:javascript
复制
myObject <- myChar[sapply(myChar, grepl, fileName)]

如果你有一个以上的命中,myObject将保存所有命中,而你的if语句不是这样的,它将被覆盖。与if一样,使用myObject[length(myObject)]将获得最后一次点击。

您还可以在正则表达式中使用|并获得匹配结果,如下所示:

代码语言:javascript
复制
myObject <- sub(paste0(".*(", paste(myChar, collapse="|"), ").*"), "\\1", fileName)
票数 2
EN

Stack Overflow用户

发布于 2019-07-24 22:56:20

一种选择是通过|将它们paste到单个字符串collapse中,并在grepl中将其作为pattern提供。|将充当OR,检查“fileName”中是否存在任何子字符串

代码语言:javascript
复制
grepl(paste(myChar, collapse="|"), fileName)

或者另一种选择是提取

代码语言:javascript
复制
library(stringr)
str_extract(fileName, paste(myChar, collapse = "|"))
#[1] "myRef"

如果我们需要赋值,那么

代码语言:javascript
复制
myChar[lengths(sapply(myChar, function(x) grep(x, fileName))) > 0]
#[1] "myRef"
票数 1
EN

Stack Overflow用户

发布于 2019-07-24 23:00:41

使用stringr

代码语言:javascript
复制
 res<-stringr::str_extract_all(fileName,myChar)
   res[lengths(res)>0]
[[1]]
[1] "myRef"

使用base

代码语言:javascript
复制
res<-Map(function(x,y) x[grep(x,y)],myChar,fileName)
res[lengths(res)>0]
$myRef
[1] "myRef"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57185823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档