给出以下向量:
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。
答案 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"