【问题标题】:Partial String Match in R using the %in% operator?使用 %in% 运算符在 R 中进行部分字符串匹配?
【发布时间】:2019-11-01 03:35:47
【问题描述】:

我很想知道是否可以使用 R 中的 %in% 运算符进行部分字符串匹配。我知道有很多方法可以使用 stringr 等来查找部分字符串匹配,但是我当前的代码使用 %in% 运算符更容易。

例如,想象一下这个向量:

x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")

我希望每一个都是 TRUE,因为字符串包含“Withdrawn”,但只有第一个是 TRUE:

x %in% c("Withdrawn")
[1]  TRUE FALSE FALSE FALSE FALSE

我尝试使用正则表达式至少使其不区分大小写,但这使得一切都是错误的:

x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE

那么,是否有可能使用 %in% 运算符和包装器在所有这些上产生 TRUE?因为 tolower() 或 toupper() 很容易使用,所以我不关心区分大小写。但是,对我来说重要的是代码会触发“withdrawn”、“withdrawnn”和“5-withdrawn”。

编辑:这个问题被标记为这个问题的重复Case-insensitive search of a list in R;但是,它是不同的,因为它询问是否可以使用 %in% 运算符进行部分字符串匹配。链接的问题根本不使用 %in% 运算符。

【问题讨论】:

  • grep/grepl 与正则表达式一起使用,参见Case-insensitive search of a list in R
  • @WiktorStribiżew,我知道还有其他方法可以匹配字符串,但是这个问题试图看看如何使用 %in% 运算符来完成。您发送的链接没有讨论使用 %in% 运算符。
  • 但是stackoverflow.com/questions/40174604/… 以这个确切的问题结束。所以,这是一个有效的骗局。
  • @WiktorStribiżew,只要求区分大小写。我主要要求使用 %in% 运算符进行部分字符串匹配。在我的请求中,我什至提到区分大小写是一个次要请求,如果这有助于使它看起来不像重复,我可以删除它。
  • @WiktorStribiżew 我不同意。它完全不同,如果没有解释性评论,它显然不适用。

标签: r regex string string-matching in-operator


【解决方案1】:

%in% 不支持这个:它是match 函数的包装器,它使用相等比较来建立匹配,而不是正则表达式匹配。但是,您可以实现自己的:

`%rin%` = function (pattern, list) {
     vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}

这可以像%in%一样使用:

〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE

请注意,结果与您对 grepl 所期望的工作要求不同:模式匹配是不对称,您不能交换左侧和右侧。如果您只想将列表与单个正则表达式匹配,请直接使用grepl

〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE

或者,如果您更喜欢使用运算符:

`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE

【讨论】:

  • 谢谢!关于 %in% 如何工作、如何不能左右交换以及何时使用它而不是 grepl 的解释正是我所需要的。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2018-10-13
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2016-10-18
  • 1970-01-01
相关资源
最近更新 更多