基于正则表达式模式从向量中排除元素

Pas*_*ten 5 regex r

我有一些数据要使用R中的正则表达式进行清理.

很容易找到如何获取包含某些模式的元素,或者不包含某些单词(字符串),但我无法找到如何排除包含模式的单元格.

我怎么能使用一般函数只保留那些不包含PATTERN的向量的元素?

我不想举一个例子,因为这可能会导致人们使用其他(虽然通常很好)的方式而不是预期的方式回答:基于正则表达式排除.无论如何:

如何排除包含以下任何字符的所有元素: 'pyfgcrl

vector <- c("Cecilia", "Cecily", "Cecily's", "Cedric", "Cedric's", "Celebes", 
            "Celebes's", "Celeste", "Celeste's", "Celia", "Celia's", "Celina")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果将是一个空向量.

A5C*_*2T1 7

编辑:从评论中,通过一些测试,我会发现我的建议不正确.

这是两个正确的解决方案:

vector[!grepl("['pyfgcrl]", vector)]                    ## kohske
grep("['pyfgcrl]", vector, value = TRUE, invert = TRUE) ## flodel
Run Code Online (Sandbox Code Playgroud)

如果他们中的任何一个想重新发帖并接受他们的答案,我很乐意在这里删除我的.


说明

您正在寻找的一般功能是grepl.从帮助文件grepl:

grepl返回一个逻辑向量(匹配或不匹配每个元素x).

此外,您应该阅读帮助页面,regex其中描述了哪些字符类.在这种情况下,您将创建一个字符类['pyfgcrl],该字体类用于查找方括号中的任何字符.然后你可以否定这一点!.

所以,到目前为止,我们有一些看起来像:

!grepl("['pyfgcrl]", vector)
Run Code Online (Sandbox Code Playgroud)

为了得到你想要的东西,你像往常一样进行分组.

vector[!grepl("['pyfgcrl]", vector)]
Run Code Online (Sandbox Code Playgroud)

对于@flodel提供的第二个解决方案,grep默认情况下返回匹配的位置,该value = TRUE参数允许您返回实际的字符串值.invert = TRUE表示返回匹配的值.

  • `^ ['pyfgcrl]`表示:查找任何字符串*starting*,其字符为''pyfgcrl`(排除你必须使用`[^'pyfgrcl]`).这就是添加`bzz`时失败的原因.@ flodel的`grepl("['pyfgcrl]",vector,invert = TRUE)`是正确的答案. (3认同)
  • 是的,应该是:`[^'pyfgcrl]`.但即使这在R中也不起作用.它对一切都是有效的. (2认同)