Regex 过滤器/grep函数行为异常
使用以下代码仅从字符串列表中选择字母数字字符串:Regex 过滤器/grep函数行为异常,regex,r,Regex,R,使用以下代码仅从字符串列表中选择字母数字字符串: isValid = function(string){ return(grep("^[A-z0-9]+$", string)) } strings = c("aaa", "test@test.com", "", "valid") print(Filter(isValid, strings)) 输出为“aaa”test@test.com“ 为什么“有效”没有输出,为什么test@test.com“已输出?您可以使用此命令执行相反的方向,并
isValid = function(string){
return(grep("^[A-z0-9]+$", string))
}
strings = c("aaa", "test@test.com", "", "valid")
print(Filter(isValid, strings))
输出为“aaa”test@test.com“
为什么
“有效”
没有输出,为什么test@test.com“
已输出?您可以使用此命令执行相反的方向,并排除任何带有标点符号的字符串,即
isValid <- function(string){
v1 <- string[!string %in% grep('[[:punct:]]', string, value = TRUE)]
return(v1[v1 != ''])
}
isValid(strings)
#[1] "aaa" "valid"
isValidFilter
函数接受一个逻辑向量,您提供了一个数字。使用grepl
:
isValid = function(string){
return(grepl("^[A-z0-9]+$", string))
}
strings = c("aaa", "test@test.com", "", "valid")
print(Filter(isValid, strings))
[1] "aaa" "valid"
为什么grep
不工作?这是由于R将数值强制为逻辑值,以及过滤器的怪异性
下面是发生的情况,grep(“^[A-z0-9]+$”,string)
正确返回14
。这是第一个和第四个元素的匹配索引
但这不是过滤器的工作方式。它使用作为.logical(unlist(lappy(x,f))
在每个元素上运行条件
所以它运行了isValid(字符串[1])
然后isValid(字符串[2])
等等。它创造了这个:
[[1]]
[1] 1
[[2]]
integer(0)
[[3]]
integer(0)
[[4]]
[1] 1
然后调用该列表中的unlist
,以获取11
,并将其转换为逻辑向量TRUE
。所以最后你得到了:
strings[which(c(TRUE, TRUE))]
变成
strings[c(1,2)]
[1] "aaa" "test@test.com"
故事的寓意是,不要使用Filter
:)所以逻辑是,如果有任何非字母数字代码,那么就不要输出字符串?不,关键是你需要使用[A-Za-z0-9]
,但我发现它仍然不起作用。使用字符串[grepl(^[:alnum:]+$,strings)]
返回(grep(^[A-Za-z0-9]+$”,字符串,value=TRUE))
似乎适合我。