R 如何检测字符串是否包含电子邮件地址并提取电子邮件地址和前 5 个单词?
R how to detect if a string contains an email address and extract the email address and the previous 5 words?
R 正则表达式问题:我有一份 data.frame 职位名称和职位描述,我需要
1) 检查职位描述是否包含电子邮件地址(可以是 .org、.edu、.gov、.com),以及
2) 提取电子邮件地址和电子邮件地址前面的 5 个单词
数据集可以包含以 .edu、.com 等结尾的网址,还可以包含 returns。基本上,我希望将电子邮件地址识别为具有 [letters/numbers]@[letters/numbers](.org、.edu、.gov、.com 以及电子邮件可以结尾的任何其他内容)
这是一个示例数据集:
teststr = data.frame(job_title = c(1:8),
job_description = c('please send your resumes to adsf@dsf.com apply now!',
'asdfa@asdf.com/adsf asdf',
'visit us at sfds@adfa',
'apply now',
'follow us on @asdf.gov',
'asdfa.gov',
'.com',
''))
> teststr
job_title job_description
1 1 please send your resumes to adsf@dsf.com apply now!
2 2 asdfa@asdf.com/adsf asdf
3 3 visit us at sfds@adfa
4 4 apply now
5 5 follow us on @asdf.gov
6 6 asdfa.gov
7 7 .com
8 8
我尝试了 (1),但得到了错误的答案
grepl('(*@.+\.com)|(*@\S\.gov)', teststr$job_description)
(1) 的正确结果应该是
TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
以下模式应与大多数电子邮件地址格式匹配:
([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)
要捕获前五个单词,请按模式拆分字符串,然后再按空格拆分字符串,并捕获最多 6 个(含)元素。
这应该适合您。 (?:\w+ ){0,5}\w+@\w+\.(?:com|gov|edu|org)
这是一个获取字符串的 stringr
示例。如果你只需要 T/F 你可以做 grepl
.
library(stringr)
str_extract(teststr$job_description,"(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)")
# [1] "please send your resumes to adsf@dsf.com" "asdfa@asdf.com"
# [3] NA NA
# [5] "follow us on @asdf.gov" NA
# [7] NA NA
grepl("(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)",teststr$job_description)
# [1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE
R 正则表达式问题:我有一份 data.frame 职位名称和职位描述,我需要
1) 检查职位描述是否包含电子邮件地址(可以是 .org、.edu、.gov、.com),以及
2) 提取电子邮件地址和电子邮件地址前面的 5 个单词
数据集可以包含以 .edu、.com 等结尾的网址,还可以包含 returns。基本上,我希望将电子邮件地址识别为具有 [letters/numbers]@[letters/numbers](.org、.edu、.gov、.com 以及电子邮件可以结尾的任何其他内容)
这是一个示例数据集:
teststr = data.frame(job_title = c(1:8),
job_description = c('please send your resumes to adsf@dsf.com apply now!',
'asdfa@asdf.com/adsf asdf',
'visit us at sfds@adfa',
'apply now',
'follow us on @asdf.gov',
'asdfa.gov',
'.com',
''))
> teststr
job_title job_description
1 1 please send your resumes to adsf@dsf.com apply now!
2 2 asdfa@asdf.com/adsf asdf
3 3 visit us at sfds@adfa
4 4 apply now
5 5 follow us on @asdf.gov
6 6 asdfa.gov
7 7 .com
8 8
我尝试了 (1),但得到了错误的答案
grepl('(*@.+\.com)|(*@\S\.gov)', teststr$job_description)
(1) 的正确结果应该是
TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
以下模式应与大多数电子邮件地址格式匹配:
([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)
要捕获前五个单词,请按模式拆分字符串,然后再按空格拆分字符串,并捕获最多 6 个(含)元素。
这应该适合您。 (?:\w+ ){0,5}\w+@\w+\.(?:com|gov|edu|org)
这是一个获取字符串的 stringr
示例。如果你只需要 T/F 你可以做 grepl
.
library(stringr)
str_extract(teststr$job_description,"(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)")
# [1] "please send your resumes to adsf@dsf.com" "asdfa@asdf.com"
# [3] NA NA
# [5] "follow us on @asdf.gov" NA
# [7] NA NA
grepl("(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)",teststr$job_description)
# [1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE