【问题标题】:Partial string matching in R [duplicate]R中的部分字符串匹配[重复]
【发布时间】:2016-01-07 13:46:28
【问题描述】:

我正在尝试从 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)

感谢您的帮助!!!

【问题讨论】:

  • 你为什么要逃避@?此外,您最好避开点(例如no\\.com)。请记住,模式no.com 与no.com 匹配,但也与noRcom 或no com 匹配。点代表正则表达式中的任何字符。

标签: r string csv pattern-matching


【解决方案1】:

您的功能非常接近。请注意一些调整:

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  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2014-08-07
    • 2014-05-21
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多