我在R中使用大量密码数据集(1000万),并希望根据特定条件为每个密码分配一个值。如果它全部小写或全部为大写,26,所有数字,10,混合大小写,52,所有标点符号,31等等。其中一部分当然是标识每个密码所属的组。
我知道我可以使用嵌套的if-statments和regex来实现这一点,但它会变得非常混乱。我对编程比较陌生,所以我无法找到更好的方法来实现这一目标。
一个想法是我可以使用for循环来运行所有密码,我可能最终会这样做,但这并没有消除对嵌套if语句的需求。循环。
如果我坚持使用正则表达式/ ifs,我的代码将如何显示:
ifelse((grepl("[0-9]", most_repeated_pass)),10,
ifelse((grepl("[a-z]", most_repeated_pass)),26,
ifelse((grepl("[A-Z]", most_repeated_pass)),26, 0)))
等等。以上内容将在for循环中。
必须有更好的方法。即使只是指出我正确的方向,我们也非常感激。
答案 0 :(得分:0)
您可以浏览有助于以人类可读方式构建正则表达式的rebus
包。下面pattern
中的参数str_detect
包含rebus
中的函数。
PASSWORD <- c("124626", "HEIOAFKN", "aaaxy", "Az705", "#\"#!!")
df <- data.frame(NO = 1:5, PASSWORD)
我还使用stringr
和dplyr
进行字符串和数据操作。
library(rebus)
library(stringr)
library(dplyr)
df %>%
mutate(VALUE = case_when(str_detect(PASSWORD, pattern = START %R% one_or_more(ALPHA) %R% END) ~ 26,
str_detect(PASSWORD, pattern = START %R% one_or_more(DGT) %R% END) ~ 10,
str_detect(PASSWORD, pattern = START %R% one_or_more(PUNCT) %R% END) ~ 31,
TRUE ~ 52))
结果输出为:
# NO PASSWORD VALUE
# 1 1 124626 10
# 2 2 HEIOAFKN 26
# 3 3 aaaxy 26
# 4 4 Az705 52
# 5 5 #"#!! 31