加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 过滤/ grep函数表现奇怪

发布时间:2020-12-14 05:56:21 所属栏目:百科 来源:网络整理
导读:使用以下代码从字符串列表中仅选择字母数字字符串: isValid = function(string){ return(grep("^[A-z0-9]+$",string))}strings = c("aaa","test@test.com","","valid")print(Filter(isValid,strings)) 输出为[1]“aaa”“test@test.com”. 为什么“有效”没
使用以下代码从字符串列表中仅选择字母数字字符串:

isValid = function(string){
  return(grep("^[A-z0-9]+$",string))
}

strings = c("aaa","test@test.com","","valid")

print(Filter(isValid,strings))

输出为[1]“aaa”“test@test.com”.

为什么“有效”没有输出,为什么输出“test@test.com”?

解决方法

Filter函数接受一个逻辑向量,您提供了一个数字.使用grepl:

isValid = function(string){
  return(grepl("^[A-z0-9]+$",strings))
[1] "aaa"   "valid"

grep为什么不工作?这是由于R将数值强制化为逻辑和过滤器的怪异.

这就是发生的事情,grep(“^ [A-z0-9] $”,string)正确返回1 4.这是第一个和第四个元素的匹配索引.

但这不是过滤器的工作原理.它使用as.logical(unlist(lapply(x,f)))在每个元素上运行条件.

所以它运行isValid(strings [1])然后运行isValid(strings [2])等等.它创造了这个:

[[1]]
[1] 1

[[2]]
integer(0)

[[3]]
integer(0)

[[4]]
[1] 1

然后它在该列表上调用unlist以获得1 1并将其转换为逻辑向量TRUE TRUE.所以最后你得到了:

strings[which(c(TRUE,TRUE))]

变成了

strings[c(1,2)]
[1] "aaa"           "test@test.com"

故事的道德,不要使用过滤器:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读