Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 数字最后一次出现时分割,取第二部分_Regex_R - Fatal编程技术网

Regex 数字最后一次出现时分割,取第二部分

Regex 数字最后一次出现时分割,取第二部分,regex,r,Regex,R,如果我有一个字符串,并且希望在最后一个数字上拆分,并保留拆分hpw的最后一部分,我可以这样做吗 x <- c("ID", paste0("X", 1:10, state.name[1:10])) 但他会满足于: [1] "ID" "Alabama" "Alaska" "Arizona" "Arkansas" [6] "California" "Colorado" "Connecticut" "Delaware" "Flo

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

x <- c("ID", paste0("X", 1:10, state.name[1:10]))
但他会满足于:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    
我可以通过以下方式获得第一部分:

unlist(strsplit(x, "[^0-9]*$"))
但是我想要第二部分

先谢谢你

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


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

这似乎有点笨拙,但它可以:

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

您可以使用正则表达式执行这一简单步骤:

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

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

正则表达式的作用:

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

  • 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"    
    
    它匹配后接单词字符的最后一个数字,并返回单词字符,如果不匹配,则匹配行尾(以确保匹配某些内容)。如果第一次匹配成功,则返回它;否则,back引用将为空,因此返回NA

    请注意,公式是编写函数
    函数(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"    
    
    >s ifelse(nchar、s、NA)
    [1] 阿拉巴马州阿拉斯加州亚利桑那州阿肯色州
    [6] “加利福尼亚”“科罗拉多”“康涅狄格”“特拉华”“佛罗里达”
    [11] “格鲁吉亚”
    

    编辑:小的改进

    我甚至演示了重塑列名的方法。谢谢你提醒我我是个笨蛋。可能是最短的答案。非常好的解释,很多正则表达式的答案都没有+谢谢你让NA进来。非常短+1您可以在不加载stringr的情况下执行基本相同的操作:
    sapply(strsplit(x,[0-9]),tail,n=1)
    @Dason-这是一个简洁易懂的解决方案。我总是忘记使用
    tail
    head
    ——也许我应该在我的
    中写点什么。第一个
    文件说:“不要忘记函数x,y,z-签名,Me。”
     [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut"
     [9] "Delaware"    "Florida"     "Georgia"  
    
    > 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"    
    
    > 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"