【问题标题】:Regular Expression in Base R Regex to identify email addressBase R Regex 中的正则表达式用于识别电子邮件地址
【发布时间】:2013-10-13 03:27:16
【问题描述】:

我正在尝试使用 stringr 库从一个大而杂乱的文件中提取电子邮件。

str_match 不允许 perl=TRUE,而且我无法找出转义字符来使其工作。

有人可以推荐一个相对健壮的正则表达式,可以在下面的上下文中工作吗?

c("larry@gmail.com", "larry-sally@sally.com", "larry@sally.larry.com")->emails
"SomeRegex"->regex
str_match(emails, regex)

【问题讨论】:

  • 嗯,您对 SomeRegex 的最佳猜测是什么?另外,我认为您的示例应该包括您不希望匹配的案例。我可以将所有这些都与.* 匹配,对吗?
  • 如果我使用grep("@", emails),它匹配正确。
  • 另外,str_match 提取第一个匹配组。这是您想要的还是要提取所有匹配的组?
  • R 中,grep 通常将多个字符串的向量与一个正则表达式匹配
  • @hwnd 我的印象是 OP 想要的。

标签: regex r stringr


【解决方案1】:
> "^[[:alnum:].-_]+@[[:alnum:].-]+$"->regex
> str_match(emails, regex)
     [,1]                   
[1,] "larry@gmail.com"      
[2,] "larry-sally@sally.com"
[3,] "larry@sally.larry.com"

@-符号不需要在正则表达式中转义。和 ”。”和“-”在字符类中并不特殊。如果您想为“.com”、“.co”、“.edu”、“.org”添加要求,则应指定该列表的完整程度。

正如 M42 所指出的,这不是万无一失的方法。事实上声称没有万无一失的方法:Using a regular expression to validate an email address

【讨论】:

  • 它将匹配...@---
  • 是的,它会的。我对这个问题的理解是,提问者需要一个开始,其中包括对正则表达式元字符的讨论。 toomey8 没有提供包含需要拒绝的项目的测试用例。
  • 这个答案对我有用,但对于后人来说,值得一提的是,我已经转向 Python,因为更广泛的支持和通用库完成了很多任务(解析 xml、连接到谷歌分析、连接到谷歌电子表格,从 URL 中获取 tld)更容易,并且随着 Pandas 的出现,在 Python 上工作似乎更有效。
  • ...这在很多情况下都不起作用,包括例如带有 2 个星号的东西...
【解决方案2】:

我发现这个正则表达式更适合我:

^[[:alnum:]._-]+@[[:alnum:].-]+$

破折号在字符类中确实具有特殊含义,除非它是最后一个字符。它是一个范围运算符,如 "A-Z"

【讨论】:

    【解决方案3】:

    实际上,我建议使用更长的正则表达式,因为上面的解决方案允许使用像 test@test.com. 这样带有尾随点的电子邮件。

    isMail <- function(x){
       grepl("^[[:alnum:]._-]+@[[:alnum:].-]+$", x))
    }
    

    【讨论】:

    • 应该是``` "^[[:alnum:]._-]+@[[:alnum:].-]+[:alnum:]+$" ```那么呢?
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 2017-01-12
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多