R匹配忽略大小写和特殊字符

时间:2020-02-21 14:22:19

标签: r regex string match

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

我想用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)),但是并没有提供相同类型的输出(而且我也不知道如何在其中合并特殊字符/空格。

2 个答案:

答案 0 :(得分: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-02-21创建

答案 1 :(得分:2)

看到@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))
相关问题