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)
不抽雪茄。
解决方案
我们可以用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"
推荐阅读
- java - 如何递归删除未排序列表中小于给定 int 的所有元素?
- java - Java - 运算符不等于不在字符串的 if 条件下工作
- kotlin - 结构化并发和协程的“一劳永逸”
- unit-testing - Roboletric 无法使自定义对话框可见
- excel - 根据多列中的条件查找平均值
- mysql - 如何在一个联合中订购 2 个表?
- f# - 为什么这个使用 IndexOf 的函数总是返回 0?
- google-bigquery - 在 google Bigquery API 中出现间歇性 404 Not Found 错误
- html - 使用 CSS 用类型装饰单词
- go - 使用 libfuzzer 对 Go 应用程序进行模糊测试:错误的覆盖范围