gpt4 book ai didi

regex - 过滤器/grep 函数行为异常

转载 作者:行者123 更新时间:2023-12-04 23:40:30 24 4
gpt4 key购买 nike

使用以下代码从字符串列表中仅选择字母数字字符串:

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" .

为什么是 "valid"没有输出,为什么是 "test@test.com"输出?

最佳答案

Filter函数接受一个逻辑向量,你提供了一个数字。使用 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 将数值强制转换为逻辑值以及 Filter 的奇怪之处。 .

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

但事实并非如此 Filter作品。它使用 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"

故事寓意,不要用 Filter :)

关于regex - 过滤器/grep 函数行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39020227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com