正则表达式 – 过滤/ 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" 故事的道德,不要使用过滤器:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |