R中的部分字符串匹配

时间:2016-01-07 13:46:29

标签: r string csv pattern-matching

我正在尝试从csv中删除“错误”的电子邮件地址。我有一列电子邮件,看起来像“abd@no.com”,“123 @ none.com”,“@”或“a”。有各种各样的电子邮件格式,所以我想尝试查找和删除它们。

我的初衷是严格查看电子邮件字符串的末尾 - “@ ...”部分。然后还要查看一个字符的长度,所以如果电子邮件的长度只有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)

感谢您的帮助!!!

1 个答案:

答案 0 :(得分: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("pierre@gmail.com", "hi@none.com", "@", "a")
email_clean(emails)
# [1] "pierre@gmail.com" NA                 NA                
# [4] NA