R 项列表中的字符串匹配

R 项列表中的字符串匹配,r,string,match,R,String,Match,更新我提出的问题时,我有一个存储字符串的对象搜索字符串 > search_string [1] “巴德之光-欧洲之母” 我还有一个列表对象,它存储了品牌名称和区域名称。现在使用search_字符串,我在filter_值中搜索它,并返回年份和品牌名称。我使用下面的命令来实现这一点 > lapply(filter_values, function(x) { + x[sapply(paste0('\\b',x,'\\b'), grepl,input$param$que

更新我提出的问题时,我有一个存储字符串的对象搜索字符串

> search_string
[1] “巴德之光-欧洲之母”

我还有一个列表对象,它存储了品牌名称和区域名称。现在使用search_字符串,我在filter_值中搜索它,并返回年份和品牌名称。我使用下面的命令来实现这一点

> lapply(filter_values, function(x) {
    +       x[sapply(paste0('\\b',x,'\\b'), grepl,input$param$query, ignore.case=T)]
    +     
    +     })
$Brand
[1] "Bud Light"          "Bud Light - Mother"

$Zone
[1] "EUR"
现在,我面临的问题是,如果您注意到返回的输出,请搜索Bud Light-Mother
列表中还返回不需要的Bud Light
我如何限制它只返回输入/请求的内容,而不返回最接近的匹配项,如现在返回的。

一个想法是从年份中删除
搜索字符串,并匹配品牌,反之亦然,即

Map(function(x, y) grep(x, y, value = TRUE), 
         c(trimws(gsub('[0-9]{4}', '', search_string)), gsub('\\D+', '', search_string)), 
         filter_values)

#$`Bud Light - Mother`
#[1] "Bud Light - Mother"

#$`2014`
#[1] "2014"
根据@Cath的评论,使用strsplit可以获得相同的结果

Map(function(x, y) grep(x, y, value = TRUE), 
    strsplit(search_string, "\\s(?=\\d{4})", perl=TRUE)[[1]], 
    filter_values)

感谢您快速有效的回答,但我们这里的限制条件是,我们无法在搜索时对年份或品牌采取任何特定行动,因为筛选值列表将是动态的,可能不包含年份,但稍后会包含其他内容。搜索必须是动态的。您可以使用
strsplit(搜索字符串,\\s(?=\\D{4}),perl=TRUE)[[1]]
-)@如果您有任何限制,请更新您的问题them@Cath在更新命令时,将其更新到此lappy(filter_values,function(x){x[sapply(paste0('\\b',x'\\b')、grepl、strsplit(search_string,“\\s(?=\\d{4})”,perl=TRUE)[[1]],ignore.case=T)])它返回这个$Brand[1]“Bud Light”NA$Year[1]“2015”,但它应该是品牌中的“Bud Light-Mother”。以品牌名称返回NA。