Base R中的正则表达式(Regex)用于识别电子邮件地址

7

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

str_match不允许perl=TRUE,并且我无法弄清楚转义字符以使其工作。

有人能推荐一个相对强大的正则表达式,适用于下面的情况吗?

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

3
你最佳的"猜测"是什么正则表达式?此外,我认为你的示例应包括不想匹配的情况。我可以使用.*来匹配所有这些情况,对吗? - Frank
如果我使用 grep("@", emails),它会正确匹配。 - RJ-
而且,str_match 仅提取第一个匹配组。这是您想要的吗?还是您想要提取所有匹配组? - RJ-
R 中,grep 通常会将多个字符串的向量与一个正则表达式进行匹配。 - hwnd
@hwnd 我的印象是这正是原帖作者想要的。 - RJ-
3个回答

10
> "^[[: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所指出的那样,这并不是一种百分之百有效的方法。事实上,据称没有百分之百有效的方法:使用正则表达式验证电子邮件地址


1
它将匹配...@--- - Toto
是的,会的。我理解问题是询问者需要一个包括正则表达式元字符讨论的起点。toomey8没有提供需要被拒绝的项目的测试案例。 - IRTFM
这个答案对我有用,但为了后人,值得一提的是,我转向了Python,因为更广泛的支持和通用库使得许多任务(解析xml、连接到Google分析、连接到Google电子表格、从URL中获取tld等)变得更加容易,并且随着Pandas的出现,使用Python似乎更加有效。 - toomey8
这对许多情况都不起作用,包括例如带有2个星号的事物... - Sheridan Grant
小改进:使用 ^[[:alnum:].-_\\+]+@[[:alnum:].-]+$ 来包括 "@" 前面的部分中的 "+" 符号(这是一个有效的地址,可以在 Gmail 和 G Suite 中用于创建别名)。 - Adi Sarid

4
我发现这个正则表达式对我来说更有效:
^[[:alnum:]._-]+@[[:alnum:].-]+$

在字符类中,除非连字符是最后一个字符,否则它具有特殊含义。它是一个范围运算符,例如“A-Z”。


0
其实,我建议使用更长的正则表达式,因为上面的解决方案允许像test@test.com.这样带有尾随点的电子邮件。
isMail <- function(x){
   grepl("^[[:alnum:]._-]+@[[:alnum:].-]+$", x))
}

难道不应该是这样吗?"^[[:alnum:]._-]+@[[:alnum:].-]+[:alnum:]+$" - SJGD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接