如何使用R或命令行从文本文件中提取匹配电子邮件地址的表达式?

3
我有一个文本文件,其中包含电子邮件地址和一些信息。
我想知道如何使用R或终端提取这些电子邮件地址?
我已经阅读到可以使用某些正则表达式来匹配电子邮件地址,例如:
"^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$" 

但是我应该使用什么命令或函数来提取这些电子邮件?

文本文件中没有模式。命令或函数应该只是在文档中进行搜索并提取电子邮件地址。

3个回答

4

让我们来看一个无结构的示例文件:

this is a test

fred is fred@foo.com and joe is joe@example.com - but
 @this is a twitter handle for twit@here.com

然后,如果你执行以下操作:
myText <- readLines("testmail.txt")
emails = unlist(regmatches(myText, gregexpr("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", myText)))
> emails
[1] "fred@foo.com"    "joe@example.com" "twit@here.com"  

它提取了包括同一行有多个电子邮件地址的所有电子邮件地址向量。我认为它不会找到跨行断开的电子邮件地址,但如果您将读取的行粘贴在一起,它也可能找到这种情况:

> myText = paste(readLines("testmail.txt"),collapse=" ")
> emails = regmatches(myText, gregexpr("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", myText))
> emails
[[1]]
[1] "fred@foo.com"    "joe@example.com" "twit@here.com"  

在这种情况下,myText 中只有一行,因为我们将所有行粘在了一起,所以返回的emails对象中只有一个元素。
请注意,正则表达式字符串并不是一个有效电子邮件地址的严格定义。例如,它仅限于在最后一个点之后介于2到4个字符的地址。因此,它无法匹配 fred@foo.fnord。还有一些顶级域名的长度超过四个字符,因此您可能需要修改正则表达式。
此外,它仅在名称部分匹配字母数字和点号 - 因此有效的地址,例如foo+bar@google.com无法匹配。
解决这两个问题的正则表达式可能是:
 "([_+a-z0-9-]+(\\.[_+a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,14}))"

但它可能存在其他问题,你最好在网上搜索更好的电子邮件地址正则表达式。我说更好是因为完美的正则表达式并不存在...


@Spacedmn,第二个正则表达式中的“2,14”应该改为“2,4”吗? - Tyler Rinker
@TylerRinker,实际上应该是“{2,63}”。https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax,_internationalization - djhurio

1
这也可以工作:
 aa <- paste(readLines("C:\\MY_FOLDER\\NOI\\file1sample.txt"),collapse = " ")
 temp <- sapply(str_extract_all(aa,"[a-z_+0-9]+\\@\\w+\\.[a-z]{2,4}"), function(x){ paste(x,collapse = " ")})

0

将文件读入R并使用grep

myText <- readLines("your.file")
Emails <- grep("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$", myText, value=T)

如果在该行上出现其他信息,则此代码将返回包含电子邮件的整个行,您需要使用类似于 strsplit 的方法先将其拆分。


只有当该行仅包含电子邮件地址时,才能匹配正则表达式,因为您在正则表达式中使用了 ^ 和 $ 这两个锚定符号。 - Spacedman

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