2016-01-07 235 views
1

我試圖從csv中刪除'壞'電子郵件地址。我有一列看起來像「[email protected]」,「[email protected]」,「@」或「a」的電子郵件。有各種各樣的電子郵件格式,所以我想嘗試查找和刪除它們。R中部分字符串匹配

我的最初想法是嚴格看電子郵件字符串的末尾 - 「@ ...」部分。然後再看一個字符的長度,所以如果電子郵件只有長度1或2,它是無效的。

如果我有一個錯誤的電子郵件列表,我想生成一個新的電子郵件列表,其中壞的電子郵件被NA替換。

下面是我到目前爲止的代碼,但它不工作,並尋找模式上的精確匹配,而不僅僅是字符串的結尾。

 email_clean <- function(email, invalid = NA) 
     { 
     email <- trimws(email)    # remove whitespace 
     email[nchar(email) %in% c(1,2)] <- invalid 
     bad_email <- c("\\@no.com", "\\@none.com","\\@email.com","\\@noemail.com") 
     pattern = paste0("(?i)\\b",paste0(bad_email,collapse="\\b|\\b"),"\\b") 
     emails <-gsub(pattern,"",sapply(csv_file$Email,as.character)) 
     email 
     } 

     Cleaned_Email <- email_clean(csv_file$Email) 

謝謝你的幫助!

+3

爲什麼你要逃避'@'?此外,您最好避開點(例如'no \\。com')。請記住,'no.com'模式與'no.com'匹配,但也使用'noRcom'或'no com'。點表示正則表達式中的任何字符。 – nicola

回答

2

你的功能非常接近。只需注意一些調整:

email_clean <- function(email, invalid = NA) 
{ 
     email <- trimws(email)    # remove whitespace 
     email[nchar(email) %in% c(1,2)] <- invalid 
     bad_email <- c("\\@no.com", "\\@none.com","\\@email.com","\\@noemail.com") 
     pattern = paste0("(?i)\\b",paste0(bad_email,collapse="\\b|\\b"),"\\b") 
     email <-gsub(pattern, invalid, sapply(email,as.character)) 
     unname(email) 
} 

emails <- c("[email protected]", "[email protected]", "@", "a") 
email_clean(emails) 
# [1] "[email protected]" NA     NA     
# [4] NA