Regex 如何使用R或命令行在文本文件中提取与电子邮件地址匹配的表达式?
我有一个包含电子邮件地址和一些信息的文本文件 我想知道如何使用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
"^[_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 = " ")})