【问题标题】:R match ignore case and special charactersR匹配忽略大小写和特殊字符
【发布时间】:2020-02-21 14:22:19
【问题描述】:

我已经搜索并找到了类似的答案,但不是我需要的。

我想识别 2 个字符串中的匹配项,忽略大小写和空格以及特殊字符。

list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')

以下所有内容都应给出相同的输出 (1 2 3)

match(list1, list1)
match(list1, list2)
match(list1, list3)

我尝试过str_detect(list1, regex(list2, ignore_case = TRUE)),但这并没有提供相同类型的输出(而且我不知道如何在其中合并特殊字符/空格。

【问题讨论】:

    标签: r regex string match


    【解决方案1】:

    看到@Allan Cameron 在我之前发布了一个非常相似的解决方案......无论如何都要离开这个,因为足够不同......?!

    list1 <- c('a', 'b', 'c')
    list2 <- c('A', 'B', 'C')
    list3 <- c('a-', 'B_', '- c')
    

    正则表达式用空字符串替换任何不是字母字符的符号:

    f <- function(x) {
      return(tolower(gsub("[^[:alpha:]]", "", x)))
    }
    
    match(f(list1), f(list2))
    match(f(list1), f(list3))
    match(f(list2), f(list3))
    

    【讨论】:

    • 是的,我认为完全不同。您选择的版本可能取决于确切的用例,尽管两者在这里做同样的事情。
    • 就我而言,我的代表并不完美 - 在我的真实数据中,我的字符串有 > 1 个字母,所以这个解决方案适合我。
    • 很高兴能帮上忙!祝你有美好的一天
    【解决方案2】:

    您可以创建一个正则表达式,使用gsub 仅提取字符串中间的字母,然后将它们转换为小写。然后,您可以在结果上使用标准 match。最好将所有这些都放在自己的函数中:

    list1 <- c('a', 'b', 'c')
    list2 <- c('A', 'B', 'C')
    list3 <- c('a-', 'B_', '- c')
    
    match2 <- function(a, b)
    {
      a <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", a))
      b <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", b))
      match(a, b)
    }
    
    match2(list1, list1)
    #> [1] 1 2 3
    match2(list1, list2)
    #> [1] 1 2 3
    match2(list1, list3)
    #> [1] 1 2 3
    

    reprex package (v0.3.0) 于 2020 年 2 月 21 日创建

    【讨论】:

    • 如果您添加说明正则表达式对可能无法破译它的人所做的事情会很有帮助
    猜你喜欢
    • 2015-07-07
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2020-06-13
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多