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

Regex 如何使用R或命令行在文本文件中提取与电子邮件地址匹配的表达式?,regex,r,terminal,command,Regex,R,Terminal,Command,我有一个包含电子邮件地址和一些信息的文本文件 我想知道如何使用R或终端提取这些电子邮件地址 我已经读到,我可以使用一些正则表达式来匹配电子邮件地址,例如 "^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$" 但是我应该使用什么命令或功能来提取这些电子邮件呢 文本文件中没有模式。命令或函数只需搜索文档并提取电子邮件地址。将文件读入R并使用grep myText <- readLines("yo

我有一个包含电子邮件地址和一些信息的文本文件

我想知道如何使用R或终端提取这些电子邮件地址

我已经读到,我可以使用一些正则表达式来匹配电子邮件地址,例如

"^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$" 
但是我应该使用什么命令或功能来提取这些电子邮件呢


文本文件中没有模式。命令或函数只需搜索文档并提取电子邮件地址。

将文件读入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)

myText让我们以一个非结构化的示例文件为例:

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
中只有一行,因为我们将所有行粘贴在一起,所以返回的列表
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}))"
但它可能有其他问题,你最好在网上搜索一个更好的电子邮件地址regex。我说得更好,因为完美的不存在…

这也可以:

 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 = " ")})

aa仅当行中只包含一封电子邮件,因为您使用^and$锚定了正则表达式。第二个正则表达式上的
2,14
是否应为
2,4
 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 = " ")})