2017-07-12 34 views
0

我在R中使用大量密碼數據集(1000萬),並想根據特定條件爲每個密碼分配一個值。如果它全部是小寫或全部大寫,26,所有數字,10,混合大小寫,52,所有標點符號,31等等。其中的一部分當然是識別每個密碼屬於哪個組。簡化正則表達式和if語句

我知道我可以使用嵌套if-statments和正則表達式來實現這一點,但它會變得令人難以置信的混亂。我對編程相對來說比較陌生,所以我無法想出一個更好的方法來實現這一點。

一個想法是,我可以使用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

你也許可以打破這種下降到了一系列基本布爾變量表示每種性格類型的存在。然後你可以尋找它們的相互作用。數字'\\ d',大寫字符'[A-Z]',小寫字符'[a-z]',標點符號'[[:punct:]]'。隨你。將每個變量放在'interaction(...)'中並適當標記。 – thelatemail

+0

第三個ifelse可以合併到第二個。 – Hugh

回答

0

您可以探索rebus軟件包,該軟件包可幫助用戶以可讀的方式構建正則表達式。下面的參數patternstr_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