R从字符串中提取数字

时间:2014-07-06 11:50:20

标签: r

字符串将是

"-042-195" "+143-192" "-001*145" "#045+125" "#125$" 

如何提取最后一组数字?

"195" "192" "145" "125" "125"

4 个答案:

答案 0 :(得分:2)

可能更好的方法,但你可以strsplit,然后取结果的最后一个元素

> sapply(strsplit(myData, "-|[*]|[+]|#|[$]"), tail, n = 1)
[1] "195" "192" "145" "125" "125"

或替换所有非字母数字字符然后拆分并取最后一个数字

> sapply(strsplit(gsub("[^[:alnum:] ]", "&", myData), "&"), tail, n = 1)
[1] "195" "192" "145" "125" "125"

答案 1 :(得分:2)

尝试:

 v1 <- c("-042-195","+143-192","-001*145", "#045+125", "#125$")
 library(stringr)
 str_extract(v1, perl("(?<=[^0-9])[0-9]+(?=[^0-9]?$)"))
 #[1] "195" "192" "145" "125" "125"

解释

 (?<=[^0-9]) #look behind for all except numbers
 [0-9]+ #followed by numbers
 (?=[^0-9]?$ #look ahead for all except numbers if present near the end

或者

  sapply(str_extract_all(v1, "\\d+"),tail,1)
 #[1] "195" "192" "145" "125" "125"

或者

 library(stringi)
  stri_extract_last(v1,regex="\\d+")
 #[1] "195" "192" "145" "125" "125"

答案 2 :(得分:2)

1)sub 如果ch是字符串的输入向量,则使用sub,其正则表达式匹配任何非数字({{1} })后跟数字("\\D"),后跟其他任何内容("\\d+")并返回匹配的数字:

".*"

如果我们保证数字前面至少有一个非数字,这就是问题中的例子,那么sub(".*\\D(\\d+).*", "\\1", paste(" ", ch)) ## [1] "195" "192" "145" "125" "125" 可以简化为paste(" ", ch)

ch

2)gsubfn package中的strapplyc sub(".*\\D(\\d+).*", "\\1", ch) ## [1] "195" "192" "145" "125" "125" 与指定的正则表达式匹配,允许比上面更简单的正则表达式:

strapplyc

2a)strapply 或使用library(gsubfn) sapply(strapplyc(ch, "\\d+"), tail, 1) ## [1] "195" "192" "145" "125" "125" (最后没有strapply)与c返回数字:

as.numeric

答案 3 :(得分:0)

感觉像打桩一样,但这适用于给定的样本:

v1 <- c("-042-195","+143-192","-001*145", "#045+125", "#125$")
v1 <- gsub("\\D", "", v1)
v1 <- substr(x = v1, start = nchar(v1)-2, nchar(v1))

Gsub除了数字之外的所有内容,然后拨打substr以保留最后的三位数字