gpt4 book ai didi

regex - R正则表达式查找最后一次出现的分隔符

转载 作者:行者123 更新时间:2023-12-01 06:57:05 25 4
gpt4 key购买 nike

我正在尝试获取电子邮件地址的结尾(即 .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"

得到这样的东西的任何建议:
    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

编辑:
另一种尝试:
> list2 <- stri_split_fixed(df1$X2, '\.(?!.*\.)\w+', 2);list2
Error: '\.' is an unrecognized escape in character string starting "'\."

最佳答案

这里有一些方法。第一个看起来特别直接,第二个特别短。

1) 子 这可以通过 sub 的应用程序来完成。在 R 中生成每一列:

data.frame(X1 = sub("@.*", "", strings1), 
X2 = sub(".*@", "", strings1),
X3 = sub(".*[.]", "", strings1),
stringsAsFactors = FALSE)

给予:
    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

2) 绑带这是使用特别短的 gsubfn 包的替代方法。这将返回一个字符矩阵。 strappylyc返回与括号中模式部分的匹配。第一组括号匹配@ 之前的所有内容,第二组括号匹配@ 之后的所有内容,最后一组括号匹配最后一个点之后的所有内容。
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"

2a) read.pattern read.pattern同样在 gsubfn 包中也可以使用相同的 pat (2) 中定义:
library(gsubfn)
pat <- "(.*)@(.*[.](.*))"
read.pattern(text = strings1, pat, as.is = TRUE)

给出类似于 (1) 的 data.frame,但列名是 V1 , V2V3 .

3)strsplit 重叠提取使得 strsplit 难以处理但我们可以通过 strsplit 的两个应用程序来实现.第一个 strsplit在 @ 处拆分,第二个使用直到最后一个点的所有内容进行拆分。最后这个 strsplit总是产生一个空字符串作为第一个拆分字符串,我们使用 [, -1] 删除它.这给出了一个字符矩阵:
 ss <- function(x, pat) do.call(rbind, strsplit(x, pat))
cbind( ss(strings1, "@"), ss(strings1, ".*[.]")[, -1] )

给出与(2)相同的答案。

4) strsplit/sub 这是(1)和(3)的混合:
cbind(do.call(rbind, strsplit(strings1, "@")), sub(".*[.]", "", strings1))

给出与(2)相同的答案。

4a) 这是另一种使用方式 strsplitsub .在这里,我们附加一个@,后跟TLD,然后在@ 上拆分。
do.call(rbind, strsplit(sub("(.*[.](.*))", "\\1@\\2", strings1), "@"))

给出与(2)相同的答案。

更新 添加了其他解决方案。

关于regex - R正则表达式查找最后一次出现的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289681/

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