我试图获得电子邮件地址的结尾(即.net,.com,.edu等),但@之后的部分可以有多个句点.
library(stringi)
strings1 <- c(
'test@aol.com',
'test@hotmail.com',
'test@xyz.rr.edu',
'test@abc.xx.zz.net'
)
list1 <- stri_split_fixed(strings1, "@", 2)
df1 <- data.frame(do.call(rbind,list1))
> list2 <- stri_split_fixed(df1$X2, '.(?!.*.)', 2);list2
[[1]]
[1] "aol.com"
[[2]]
[1] "hotmail.com"
[[3]]
[1] "xyz.rr.edu"
[[4]]
[1] "abc.xx.zz.net"
Run Code Online (Sandbox Code Playgroud)
有任何建议可以得到这样的东西:
X1 X2 X3
1 test aol.com com
2 test hotmail.com com
3 test xyz.rr.edu edu
4 test abc.xx.zz.net net
Run Code Online (Sandbox Code Playgroud)
编辑:另一种尝试:
> list2 <- stri_split_fixed(df1$X2, '\.(?!.*\.)\w+', 2);list2
Error: '\.' is an unrecognized escape in character string starting "'\."
Run Code Online (Sandbox Code Playgroud)
G. *_*eck 13
以下是一些方法.第一个似乎特别直接,第二个特别短.
1)sub可以使用subR中的应用程序来生成每个列:
data.frame(X1 = sub("@.*", "", strings1),
X2 = sub(".*@", "", strings1),
X3 = sub(".*[.]", "", strings1),
stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
赠送:
X1 X2 X3
1 test aol.com com
2 test hotmail.com com
3 test xyz.rr.edu edu
4 test abc.xx.zz.net net
Run Code Online (Sandbox Code Playgroud)
2)strapplyc这是使用gsubfn包特别简短的替代方案.这将返回一个字符矩阵. strappylyc将匹配返回到括号中的模式部分.第一组parantheses匹配@之前的所有内容,第二组括号匹配@之后的所有内容,最后一组括号匹配最后一个点之后的所有内容.
library(gsubfn)
pat <- "(.*)@(.*[.](.*))"
t(strapplyc(strings1, pat, simplify = TRUE))
[,1] [,2] [,3]
[1,] "test" "aol.com" "com"
[2,] "test" "hotmail.com" "com"
[3,] "test" "xyz.rr.edu" "edu"
[4,] "test" "abc.xx.zz.net" "net"
Run Code Online (Sandbox Code Playgroud)
图2a)read.pattern read.pattern也在gsubfn包可以在使用相同的做pat在(2)定义:
library(gsubfn)
pat <- "(.*)@(.*[.](.*))"
read.pattern(text = strings1, pat, as.is = TRUE)
Run Code Online (Sandbox Code Playgroud)
给出类似于(1)的data.frame,除了列名是V1,V2和V3.
3)strsplit重叠提取很难做到,strsplit但我们可以用两个应用程序来完成strsplit.第一个strsplit拆分在@和第二个拆分使用一直到最后一个点拆分.这最后strsplit总是产生一个空字符串作为第一个拆分字符串,我们使用它删除它[, -1].这给出了一个字符矩阵:
ss <- function(x, pat) do.call(rbind, strsplit(x, pat))
cbind( ss(strings1, "@"), ss(strings1, ".*[.]")[, -1] )
Run Code Online (Sandbox Code Playgroud)
给出与(2)相同的答案.
4)strsplit/sub这是(1)和(3)的混合:
cbind(do.call(rbind, strsplit(strings1, "@")), sub(".*[.]", "", strings1))
Run Code Online (Sandbox Code Playgroud)
给出与(2)相同的答案.
4a)这是使用strsplit和的另一种方式sub.在这里,我们附加一个@后跟TLD然后拆分@.
do.call(rbind, strsplit(sub("(.*[.](.*))", "\\1@\\2", strings1), "@"))
Run Code Online (Sandbox Code Playgroud)
给出与(2)相同的答案.
更新添加了其他解决方
Tyl*_*ker 10
A read.table+ file_ext方法(不是正则表达式,但很简单):
dat <- read.table(text=strings1, sep="@")
dat$V3 <- tools::file_ext(strings1)
dat
## V1 V2 V3
## 1 test aol.com com
## 2 test hotmail.com com
## 3 test xyz.rr.edu edu
## 4 test abc.xx.zz.net net
Run Code Online (Sandbox Code Playgroud)
这是纯粹的正则表达式方法:
do.call(rbind, strsplit(strings1, "@|\\.(?=[^\\.]+$)", perl=TRUE))
## [,1] [,2] [,3]
## [1,] "test" "aol" "com"
## [2,] "test" "hotmail" "com"
## [3,] "test" "xyz.rr" "edu"
## [4,] "test" "abc.xx.zz" "net"
Run Code Online (Sandbox Code Playgroud)