提取所有内容,直到第三段为止

时间:2018-11-14 17:54:29

标签: r stringr

我有此Identifier

structure(list(Identifier = c("NC.1.OA", "NC.1.OA.0", "NC.1.OA.1", 
"NC.1.OA.1.a", "NC.1.OA.1.b", "NC.1.OA.1.c", "NC.1.OA.2", "NC.1.OA.2.0", 
"NC.1.OA.3", "NC.1.OA.4", "NC.1.OA.4.0", "NC.1.OA.9", "NC.1.OA.6", 
"NC.1.OA.6.a", "NC.1.OA.6.b", "NC.1.OA.6.c", "NC.1.OA.6.d", "NC.1.OA.6.e", 
"NC.1.OA.6.f", "NC.1.OA.6.f.0", "NC.1.OA.7", "NC.1.OA.8")), row.names = c(NA, 
-22L), class = c("tbl_df", "tbl", "data.frame"))

我想从此列中提取NC.1.OA。通常,这将提取从开始到第三个时段的所有内容,但是第一行会违反该规则,因为只有两个时段。

我尝试了gsub(".*\\.(.*)\\..*", "\\1", Identifier),没有雪茄。

1 个答案:

答案 0 :(得分:0)

我们可以使用str_extract

library(tidyverse)
df %>% 
  mutate(new = str_extract(Identifier, "NC\\.1\\.OA"))

此外,如果我们使用的是sub(因为我们不需要全局替换,则不需要gsub),请使用位置标识符进行修复,以将字符串的开头(^)通知。在下面的模式中,我们匹配一个不是.[^.]+)的字符,然后是.[.]-点是一个元字符,因此我们进行了转义或将其放在方括号中以按字面值求值),然后再加上一个数字(\\d+),然后是.和不是点的字符(如前所述),作为一个组捕获(用方括号括起来) ),并在替换中使用捕获组的后向引用(\\1

sub("^([^.]+[.]\\d+[.][^.]+).*", "\\1", df$Identifier)
#[1] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"
#[12] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"