R gsub 从文本中提取电子邮件
R gsub to extract emails from text
我有一个变量 a
,由包含一些电子邮件的文件的 readLines
创建。我已经只过滤了带有 @ 符号的那些行,现在正在努力获取电子邮件。我的变量中的文本如下所示:
> dput(a[1:5])
c("buenas tardes. excelente. por favor a: Saolonm@hotmail.com",
"26.leonard@gmail.com ", "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias",
"gracias andrescarnederes@headset.cl", "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "
)
从 SO 中的 this 问题我得到了一个提取电子邮件的起点(@Aaron Haurun 的回答),它略有修改(我在 @
之前添加了一个 [\w.]
地址之间带有 .
的电子邮件)在 regex101.com 中很好地提取电子邮件。但是,当我将它移植到 gsub
:
时它失败了
> gsub("()(\w[\w.]+@[\w.-]+|\{(?:\w+, *)+\w+\}@[\w.-]+)()",
"\2",
a[1:5],
perl = FALSE) ## It doesn't matter if I use perl = TRUE
[1] "buenas tardes. excelente. por favor a: Saolonm@hotmail.com" "26.leonard@gmail.com "
[3] "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias" "gracias andrescarnederes@headset.cl"
[5] "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "
我哪里做错了,我该如何获取这些电子邮件?谢谢!
根据您在问题中发布的答案,
library(stringr)
str_extract(a, '\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+')
#[1] "Saolonm@hotmail.com" "26.leonard@gmail.com" "jcdavola31@gmail.com" "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"
我们可以尝试 stringr
包中的 str_extract()
:
str_extract(text, "\S*@\S*")
[1] "Saolonm@hotmail.com"
[2] "26.leonard@gmail.com"
[3] "jcdavola31@gmail.com"
[4] "andrescarnederes@headset.cl"
[5] "luciana.chavela.ecuador@gmail.com"
其中 \S*
匹配任意数量的非 space 字符。
我们可以使用 base R
选项来做到这一点
unlist(regmatches(a, gregexpr("\S+@\S+", a)))
#[1] "Saolonm@hotmail.com"
#[2]"26.leonard@gmail.com"
#[3] "jcdavola31@gmail.com"
#[4] "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"
或者作为 OP 的 post 是关于 gsub/sub
的解决方案
sub("(.*\s+|^)(\S+@\S+).*", "\2", a)
#[1] "Saolonm@hotmail.com"
#[2] "26.leonard@gmail.com"
#[3] "jcdavola31@gmail.com"
#[4] "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"
我有一个变量 a
,由包含一些电子邮件的文件的 readLines
创建。我已经只过滤了带有 @ 符号的那些行,现在正在努力获取电子邮件。我的变量中的文本如下所示:
> dput(a[1:5])
c("buenas tardes. excelente. por favor a: Saolonm@hotmail.com",
"26.leonard@gmail.com ", "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias",
"gracias andrescarnederes@headset.cl", "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "
)
从 SO 中的 this 问题我得到了一个提取电子邮件的起点(@Aaron Haurun 的回答),它略有修改(我在 @
之前添加了一个 [\w.]
地址之间带有 .
的电子邮件)在 regex101.com 中很好地提取电子邮件。但是,当我将它移植到 gsub
:
> gsub("()(\w[\w.]+@[\w.-]+|\{(?:\w+, *)+\w+\}@[\w.-]+)()",
"\2",
a[1:5],
perl = FALSE) ## It doesn't matter if I use perl = TRUE
[1] "buenas tardes. excelente. por favor a: Saolonm@hotmail.com" "26.leonard@gmail.com "
[3] "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias" "gracias andrescarnederes@headset.cl"
[5] "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "
我哪里做错了,我该如何获取这些电子邮件?谢谢!
根据您在问题中发布的答案,
library(stringr)
str_extract(a, '\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+')
#[1] "Saolonm@hotmail.com" "26.leonard@gmail.com" "jcdavola31@gmail.com" "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"
我们可以尝试 stringr
包中的 str_extract()
:
str_extract(text, "\S*@\S*")
[1] "Saolonm@hotmail.com"
[2] "26.leonard@gmail.com"
[3] "jcdavola31@gmail.com"
[4] "andrescarnederes@headset.cl"
[5] "luciana.chavela.ecuador@gmail.com"
其中 \S*
匹配任意数量的非 space 字符。
我们可以使用 base R
选项来做到这一点
unlist(regmatches(a, gregexpr("\S+@\S+", a)))
#[1] "Saolonm@hotmail.com"
#[2]"26.leonard@gmail.com"
#[3] "jcdavola31@gmail.com"
#[4] "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"
或者作为 OP 的 post 是关于 gsub/sub
sub("(.*\s+|^)(\S+@\S+).*", "\2", a)
#[1] "Saolonm@hotmail.com"
#[2] "26.leonard@gmail.com"
#[3] "jcdavola31@gmail.com"
#[4] "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"