简化正则表达式和If-Statements

时间:2017-07-12 23:49:24

标签: r regex if-statement

我在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循环中。

必须有更好的方法。即使只是指出我正确的方向,我们也非常感激。

1 个答案:

答案 0 :(得分:0)

您可以浏览有助于以人类可读方式构建正则表达式的rebus包。下面pattern中的参数str_detect包含rebus中的函数。

PASSWORD <- c("124626", "HEIOAFKN", "aaaxy", "Az705", "#\"#!!")
df <- data.frame(NO = 1:5, PASSWORD)

我还使用stringrdplyr进行字符串和数据操作。

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