前两个之间的字符串(。点)

时间:2018-07-13 12:26:05

标签: r

嗨,您的数据包含两个或多个点。我的要求是从第一个点到第二个点获取字符串。 例如string <- "abcd.vdgd.dhdsg"

结果expected =vdgd

我用过

pt <-strapply(string, "\\.(.*)\\.", simplify =  TRUE)

给出正确的数据,但是对于具有两个以上点的字符串,它无法正常工作。 例如string <- "abcd.vdgd.dhdsg.jsgs" 其给定dhdsg.jsgs,但预期为vdgd

有人可以帮我吗?

感谢与问候,

6 个答案:

答案 0 :(得分:4)

在基数R中,我们可以使用strsplit

ss <- "abcd.vdgd.dhdsg"
unlist(strsplit(ss, "\\."))[2]
#[1] "vdgd"

或将gregexprregmatches一起使用

unlist(regmatches(ss, gregexpr("[^\\.]+", ss)))[2]
#[1] "vdgd"

或使用gsub(感谢@TCZhang)

gsub("^.+?\\.(.+?)\\..*$", "\\1", ss)
#[1] "vdgd"

答案 1 :(得分:2)

带有qdapRegex软件包的另一种解决方案:

library(qdapRegex)
ex_between("abcd.vdgd.dhdsg.jsgs", ".", ".")[[1]][1]
# "vdgd"

答案 2 :(得分:2)

另一个选择:

string <- "abcd.vdgd.dhdsg.jsgs"

library(stringr)
str_extract(string = string, pattern = "(?<=\\.).*?(?=\\.)")
[1] "vdgd"

我喜欢这个,因为str_extract函数将返回正确模式的第一个实例,但是您也可以使用str_extract_all来获取所有实例。

str_extract_all(string = string, pattern = "(?<=\\.).*?(?=\\.)")
[[1]]
[1] "vdgd"  "dhdsg"

从这里,您可以索引以获取想要的两个点之间的任何位置。

答案 3 :(得分:1)

如果愿意,也可以使用read.table。此处提供问题中给出的字符串,并将分隔符选择为dot(“。”),将列转换为data.frame之后,可以选择选择要选择的任何列(在这种情况下,该列为第2列)。

read.table(text=string, sep=".",stringsAsFactors = FALSE)[,2]

输出:

> read.table(text=string, sep=".",stringsAsFactors = FALSE)[,2]
[1] "vdgd"

答案 4 :(得分:1)

这是通过stringr

stringr::word(string, 2, sep = '\\.')

答案 5 :(得分:1)

以下是在输入字符串向量上向量化的两个选项:

  • 您可以尝试在tstrsplit上进行矢量化处理的data.table中的string
> string <- c("abcd.vdgd.dhdsg", "abcd.vdgd.dhdsg.jsgs")
> tstrsplit(string, '.', fixed = TRUE)[[2]]
[1] "vdgd" "vdgd"
  • 或正则表达式:
> sub('.*?\\.(.*?)\\..*', '\\1', string)
[1] "vdgd" "vdgd"`
相关问题