首页 > 解决方案 > 在 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)不抽雪茄。

标签: rstringr

解决方案


我们可以用str_extract

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

此外,如果我们使用sub(gsub不需要,因为我们没有全局替换),请使用位置标识符进行修复以通知^字符串的开始 ( )。在下面的模式中,我们匹配一个或多个不是.( [^.]+) 的字符,后跟一个.[.]- 点是元字符,因此我们将其转义或放在方括号中以进行字面计算),然后再匹配一个数字 ( \\d+),然后a.和不是点的字符(如前所述),作为一个组捕获(用括号括起来)并在替换中使用\\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"

推荐阅读