【问题标题】:String Matching from List of items项目列表中的字符串匹配
【发布时间】:2018-07-11 12:55:12
【问题描述】:

更新我的问题,我有一个存储字符串的对象 search_string。

> search_string

[1] “Bud Light - Mother EUR”

我有另一个存储品牌名称和区域名称的列表对象。现在使用 search_string,我在 filter_values 中搜索它并返回年份和品牌名称。我使用下面的命令来实现。

> 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,这不是必需的。 我如何限制它只返回输入/询问的内容,而不是现在返回的最接近的匹配项。

【问题讨论】:

    标签: r string match


    【解决方案1】:

    一个想法是从年份中删除search_string 并匹配品牌,反之亦然,即

    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)
    

    【讨论】:

    • 感谢您快速有效的回答,但我们这里的限制是我们在搜索时不能对年份或品牌采取任何特定操作,因为过滤器值列表将是动态的,可能不包含年份而是某些东西以后再说。搜索必须是动态的。
    • 你可以使用c(trimws(gsub('[0-9]{4}', '', search_string)), gsub('\\D+', '', search_string)) 代替strsplit(search_string, "\\s(?=\\d{4})", perl=TRUE)[[1]] ;-)
    • @RishabAsthana 如果您有任何限制,您需要向他们更新您的问题
    • @Cath 关于更新命令,到这个 lapply(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。
    猜你喜欢
    • 2019-03-09
    • 2012-03-12
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多