2016-01-07 181 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