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。