R 简化正则表达式和If语句

R 简化正则表达式和If语句,r,regex,if-statement,R,Regex,If Statement,我在R中使用大量的密码数据集(1000万),并希望根据某些标准为每个密码分配一个值。如果是全小写或全大写,26,全数字,10,混合大小写,52,全标点符号,31等等。当然,这其中的一部分是识别每个密码属于哪个组 我知道我可以使用嵌套的if语句和正则表达式来实现这一点,但它会变得非常混乱。我对编程比较陌生,所以我想不出更好的方法来实现这一点 一种想法是,我可以使用for循环来运行所有密码,最终可能会这样做,但这并不能消除循环中嵌套if语句的需要 如果我坚持使用regex/ifs,我的代码会是什么样

我在R中使用大量的密码数据集(1000万),并希望根据某些标准为每个密码分配一个值。如果是全小写或全大写,26,全数字,10,混合大小写,52,全标点符号,31等等。当然,这其中的一部分是识别每个密码属于哪个组

我知道我可以使用嵌套的if语句和正则表达式来实现这一点,但它会变得非常混乱。我对编程比较陌生,所以我想不出更好的方法来实现这一点

一种想法是,我可以使用for循环来运行所有密码,最终可能会这样做,但这并不能消除循环中嵌套if语句的需要

如果我坚持使用regex/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循环中


一定有更好的办法。即使只是给我指出正确的方向也是非常感谢的。

您可以探索
rebus
包,它有助于以人类可读的方式构建正则表达式。下面
stru detect
中的参数
pattern
包含
rebus
中的函数

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

#   NO PASSWORD VALUE
# 1  1   124626    10
# 2  2 HEIOAFKN    26
# 3  3    aaaxy    26
# 4  4    Az705    52
# 5  5    #"#!!    31

您可能会将其分解为一系列基本布尔变量,指示每个字符类型的存在。然后你可以寻找它们之间的相互作用。数字
\\d
,大写字符
[A-Z]
,小写字符
[A-Z]
,标点符号
[[:punch:]
。无论什么将每个变量放入
交互(…)
并适当标记。第三个ifelse可以合并为第二个ifelse。
#   NO PASSWORD VALUE
# 1  1   124626    10
# 2  2 HEIOAFKN    26
# 3  3    aaaxy    26
# 4  4    Az705    52
# 5  5    #"#!!    31