Regex 数字最后一次出现时分割,取第二部分
如果我有一个字符串,并且希望在最后一个数字上拆分,并保留拆分hpw的最后一部分,我可以这样做吗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
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"