gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:23:34 26 4
gpt4 key购买 nike

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

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

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

"^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,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}))"

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

关于regex - 如何使用 R 或命令行提取与文本文件中的电子邮件地址匹配的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com