是否使用%in%运算符在R中进行部分字符串匹配?

是否使用%in%运算符在R中进行部分字符串匹配?,r,regex,string,string-matching,in-operator,R,Regex,String,String Matching,In Operator,我很想知道是否可以使用R中的%in%运算符进行部分字符串匹配。我知道有很多方法可以使用stringr等来查找部分字符串匹配,但我当前的代码使用%in%运算符更容易工作 例如,想象一下这个向量: x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn") 我尝试使用regex至少使其不区分大小写,但这使得一切都是错误的: x %in% c("(?i)Withdrawn") [1] FALSE FA

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

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

x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")
我尝试使用regex至少使其不区分大小写,但这使得一切都是错误的:

x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE
那么,使用带有包装器的%in%操作符是否可能在所有这些问题上产生TRUE呢?因为使用tolower()或toupper()很容易,所以我不太关心大小写敏感度;然而,对我来说,重要的是代码将触发“撤回”、“撤回nn”和“5-撤回”


编辑:此问题被标记为此问题的副本;但是,它是不同的,因为它询问是否可以使用%in%运算符进行部分字符串匹配。链接的问题根本不使用%in%运算符。

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

`%rin%` = function (pattern, list) {
     vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}
这可以像%中的
%一样使用:

〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE
请注意,结果不同于您从
grepl
期望的工作要求:模式匹配是不对称的,您不能交换左侧和右侧。如果只想将列表与单个正则表达式进行匹配,请直接使用
grepl

〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE
或者,如果您更喜欢使用运算符:

`%matches%` = grepl

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

`%rin%` = function (pattern, list) {
     vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}
这可以像%
中的
%一样使用:

〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE
请注意,结果不同于您从
grepl
期望的工作要求:模式匹配是不对称的,您不能交换左侧和右侧。如果只想将列表与单个正则表达式进行匹配,请直接使用
grepl

〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE
或者,如果您更喜欢使用运算符:

`%matches%` = grepl

grep
/
grepl
与正则表达式一起使用,请参见@WiktorStribiżew,我知道还有其他方法可以匹配字符串,但这个问题试图了解如何使用%in%操作符来完成。您发送的链接没有讨论如何使用%in%运算符。但已关闭该链接,并给出了确切的问题。所以,这是一个有效的重复。@WiktorStribiżew,只要求区分大小写。我的主要任务是使用%in%运算符进行部分字符串匹配。在我的请求中,我甚至提到区分大小写是一个次要的请求,如果这有助于使它看起来不像是重复的,我可以删除它。@WiktorStribiżew我不同意。它与正则表达式有很大的不同,因此在没有解释性注释的情况下显然不适用。将
grep
/
grepl
与正则表达式一起使用,请参见@WiktorStribiżew,我知道还有其他匹配字符串的方法,但这个问题试图了解如何使用%in%运算符来完成。您发送的链接没有讨论如何使用%in%运算符。但已关闭该链接,并给出了确切的问题。所以,这是一个有效的重复。@WiktorStribiżew,只要求区分大小写。我的主要任务是使用%in%运算符进行部分字符串匹配。在我的请求中,我甚至提到区分大小写是一个次要的请求,如果这有助于使它看起来不像是重复的,我可以删除它。@WiktorStribiżew我不同意。这是非常不同的,它显然不适用于没有解释性评论。谢谢!我需要的正是对%in%如何工作、它如何不能左右交换以及何时使用它来代替grepl的解释。再次感谢你!非常感谢。我需要的正是对%in%如何工作、它如何不能左右交换以及何时使用它来代替grepl的解释。再次感谢你!