从字符串中提取某些数字

时间:2017-04-28 08:04:45

标签: r regex

给出以下向量:

v = c("A/5 21171", "PC 175959", "STON/O2. 3101282", "113803", "373450")

如何从每个元素中提取最后5位或6位数字?这是期望的输出

v_processed = c("21171", "175959", "3101282", "113803", "373450")

我的尝试:

v = unlist(strsplit(v, "^[^0-9]+"))
v[v == ""] = NA
v_processed = na.omit(v)

但是最后一个片段给了我这个:

"5 21171"    "175959"     "2. 3101282" "113803"     "373450" 

我不希望第一个元素中的5,也不需要" 2。"在第三个。

THX。

2 个答案:

答案 0 :(得分:2)

您可以使用

> sub(".*\\b(\\d+)$", "\\1", v)
[1] "21171"   "175959"  "3101282" "113803"  "373450" 

此处,.*\\b匹配最后一个前导词边界的所有字符,并将字符串末尾的1+位数字(\\d+)$抓取到组1中。

或者,如果数字前面有空格:

> sub(".*\\s(\\d+)$", "\\1", v)
[1] "21171"   "175959"  "3101282" "113803"  "373450" 

其中.*\\s匹配字符串直到最后一个空格。

或者,使用匹配方法。以下是如何在字符串末尾提取1位数字(整个单词):

> regmatches(v, regexpr("\\b\\d+$", v))
[1] "21171"   "175959"  "3101282" "113803"  "373450"

或者只有在前面有空格时才提取它们:

> regmatches(v, regexpr("(?<!\\S)\\d+$", v, perl=TRUE))
[1] "21171"   "175959"  "3101282" "113803"  "373450" 

这里,PCRE正则表达式(参见perl=TRUE)用于简化代码。 (?<!\\S)是一个负面的后视图,可以确保当前位置的左侧没有非空白符号。

答案 1 :(得分:1)

我们可以使用substring

substring(v, nchar(v)-c(4, 5, 6, 5, 5), nchar(v))
#[1] "21171"   "175959"  "3101282" "113803"  "373450"

str_extract

library(stringr)
str_extract(v, "\\d+$")
#[1] "21171"   "175959"  "3101282" "113803"  "373450"