在R中最后拆分一个带有数字的字符串

时间:2015-11-22 01:39:07

标签: regex r split

如何将包含数字(未知位数)的字符串拆分为两个字符串 - 数字和字符串的其余部分。请注意,字符串中可能存在其他不应受影响的数字。例如:

"abc665abc12"   -> "abc665abc", "12"
"abc665abc 182" -> "abc665abc", "182"
"abc665abc0"    -> "abc665abc", "0"

谢谢!

5 个答案:

答案 0 :(得分:8)

您也可以使用strsplit

> x = c("abc665abc12", "abc665abc 182", "abc665abc0")
> strsplit(x, "(?<=[A-Za-z])\\s*(?=\\d+$)", perl = TRUE)
[[1]]
[1] "abc665abc" "12"       

[[2]]
[1] "abc665abc" "182"      

[[3]]
[1] "abc665abc" "0"  

答案 1 :(得分:5)

这有效:

# op's example
x = c("abc665abc12", "abc665abc 182", "abc665abc0")

library(stringi)
res = stri_match_first_regex(x, "^(.*?) ?([0-9]+)$")


     [,1]            [,2]        [,3] 
[1,] "abc665abc12"   "abc665abc" "12" 
[2,] "abc665abc 182" "abc665abc" "182"
[3,] "abc665abc0"    "abc665abc" "0"  

您想要的部分位于第2列和第2列中。 3,对应于正则表达式中的括号。

答案 2 :(得分:3)

说到这样的话,我喜欢使用gsubfn包中的function setMargin() { cWidth = $('#container').width(); iWidth = $('.items').width(); totalItems = $('.items').length; itemsPerRow = parseInt(cWidth / iWidth); if(totalItems < itemsPerRow) { space = cWidth - iWidth * totalItems; margin = space/(totalItems+1); } else { space = cWidth - iWidth * itemsPerRow; margin = space/(itemsPerRow+1); } $(".items").css("margin-left", margin+"px"); }

strapply

如果你有一个角色向量,那就是相同的概念:

library(gsubfn)
strapply('abc665abc12', '(.*?) *(\\d+)$', c)[[1]]
# [1] "abc665abc" "12" 

答案 3 :(得分:2)

在基地:

cbind(x,
      gsub("[ 0-9]+$", "", x), 
      gsub("^[a-z 0-9]+[a-z ]+", "", x))

     x                                
[1,] "abc665abc12"   "abc665abc" "12" 
[2,] "abc665abc 182" "abc665abc" "182"
[3,] "abc665abc0"    "abc665abc" "0" 

答案 4 :(得分:0)

使用好的旧正则表达式解决方案:使用两个角色向量

    x <-"abc665abc12"
    y <- "abc665abc 182"
    patterns<-"[[:digit:]]+$"
    m1 <- regexpr(patterns,x) 
    m2 <-regexpr(patterns,y)

现在regmatches(x,m1)收益&#34; 12&#34; n regmatches(y,m1)收益&#34; 182&#34;