分成最后一次出现的数字,取第二部分

时间:2012-05-24 05:57:44

标签: regex r

如果我有一个字符串并希望拆分最后一个数字并保留拆分hpw的最后一部分,我可以这样做吗?

x <- c("ID", paste0("X", 1:10, state.name[1:10]))

我想要

 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

但愿意接受:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

我可以通过以下方式获得第一部分:

unlist(strsplit(x, "[^0-9]*$"))

但是想要第二部分。

提前谢谢。

4 个答案:

答案 0 :(得分:4)

您可以使用正则表达式轻松完成此操作:

gsub("(^.*\\d+)(\\w*)", "\\2", x)

结果:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut"
 [9] "Delaware"    "Florida"     "Georgia"  

正则表达式的作用:

  1. "(^.*\\d+)(\\w*)":寻找两组角色。
    • 第一组(^.*\\d+)查找任何数字,后跟字符串开头的至少一个数字。
    • 第二组\\w*查找字母数字字符。
  2. "\\2"作为gsub()的第二个参数意味着用正则表达式找到的第二个组替换原始字符串。

答案 1 :(得分:2)

library(stringr)
unlist(lapply(str_split(x, "[0-9]"), tail,n=1))

给出

[1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut" "Delaware"   
[10] "Florida"     "Georgia"

我会查看文档stringr(最有可能)更好的方法。

答案 2 :(得分:2)

这看起来有点笨重,但它有效:

state.pt2 <- unlist(strsplit(x,"^.[0-9]+"))
state.pt2[state.pt2!=""]

最好删除字符串开头的匹配所生成的"",但我无法弄明白。

这是使用substrgregexpr的另一种方法,可以避免必须对结果进行分组:

substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x))

答案 3 :(得分:2)

gsubfn

试试这个gsubfn解决方案:

> library(gsubfn)
> strapply(x, ".*\\d(\\w*)|$", ~ if (nchar(z)) z else NA, simplify = TRUE)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

它匹配最后一个数字后跟单词字符并返回单词字符,如果失败则匹配行尾(以确保它匹配某些内容)。如果第一场比赛成功,则返回;否则,后引用将为空,因此返回NA。

请注意,公式是编写函数function(z) if (nchar(z)) z else NA的简便方法,该函数可以替换公式,但代价是更多的击键。

gsub

类似的策略也可以直接使用gsub,但需要两行和一个稍微复杂的正则表达式。在这里,我们使用第二种替代方法来填充第一种替代方案中的非匹配:

> s <- gsub(".*\\d(\\w*)|.*", "\\1", x)
> ifelse(nchar(s), s, NA)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

编辑:小改进