在 gsub 之后仅提取数字的第一次出现

Extract only first appearance of number after gsub

我有这样一个字符串:

Sample.ID<-"(<SampleID>, 2213 )"

我正在使用以下 gsub 代码从此字符串中提取数字:

ID<-as.numeric(gsub("\D", "", Sample.ID))

这没问题,但有时在我的数据中字符串是这样的:

Sample.ID<-"(<SampleID>, 2213-EQUINOX BELL 2-P, )"

然后我遇到了一个问题,因为它占用了我只想拥有 2213 的所有数字(即 22132)。 解决方法是什么?

谢谢, 芳

我们可以从字符串的开头 (^) 开始匹配零个或多个不是逗号 ([^,]*) 的字符,后跟一个 ,,一个或多个 space (\s+) 或 | 一个 - 或 space 后跟其他字符 (.*) 并将其替换为空白 ("")

as.numeric(gsub("^[^,]*,\s+|(-|\s+).*", "", Sample.ID))
#[1] 2213 2213

如果没有其他限制,那么str_extract可以用来提取第一个出现的number

library(stringr)
as.numeric(str_extract(Sample.ID, "\d+"))
#[1] 2213 2213

parse_number 来自 readr

readr::parse_number(Sample.ID)
#[1] 2213 2213

或与 base R

类似的选项
as.numeric(regmatches(Sample.ID, regexpr("\d+", Sample.ID)))
#[1] 2213 2213

数据

Sample.ID <- c("(<SampleID>, 2213 )", "(<SampleID>, 2213-EQUINOX BELL 2-P, )") 

您可以捕获数字,然后使用反向引用

sub(".*?(\d+).*", "\1", Sample.ID)
[1] "2213" "2213"

因为你的数据看起来像

Sample.ID<-"(<SampleID>, 2213-EQUINOX BELL 2-P, )"

使用(?<=, )\d+匹配号码:Regex-test

以下代码匹配整个字符串并提取第一组:

gsub(".*(?<=, )(\d+).*", "\1", id, perl=TRUE)

检查代码段:R-gsub