作为我的考试练习/学习课程之一,我目前正在编写代码以使用strsplit来将字母与整数分开(对此问题尚未评分,我现在还无法掌握。) >
我尝试过:
unlist(strsplit(s, "(?<=[a-zA-Z])(?=[0-9])"))
但这不起作用。
也尝试过
unlist(strsplit(s, ""))
但这给了我char
的向量,本质上并没有将字母与整数分开。
例如,我不需要"w17u2"
成为"w"
,"1"
,"7"
,"u"
,"2"
,"w"
1}},"17"
,"u"
,"2"
。
输入将没有任何特定的模式,因此它必须能够在任何模式下将字母与整数分开。
答案 0 :(得分:2)
一种选择是使用先行/后退
ss <- "w17u2"
unlist(strsplit(ss, "((?<=[a-z])(?![a-z])|(?<=\\d)(?!\\d))", perl = T))
#[1] "w" "17" "u" "2"
说明:
(?<=[a-z])(?![a-z])
在前一个字符与[a-z]
匹配且以下字符与[a-z]
不匹配的位置分割字符串。同样,(?<=\\d)(?!\\d)
在上一个字符与一个数字匹配并且上一个字符与数字不匹配的位置分割字符串。最后的正则表达式是两个正则表达式模式的OR串联。
答案 1 :(得分:1)
您也可以使用strsplit两次,例如:
splitnums <- function(s) {
v1 <- strsplit(s, '\\d+')[[1]] # "aa" "ss" "d" "f"
v2 <- strsplit(s, '\\D+')[[1]] # "" "2" "3" "22" "5"
if (v1[1] == "") return(c(rbind(v2, v1[2:length(v1)])))
else return(c(rbind(v1, v2[2:length(v2)])))
}
splitnums('aa2ss3d22f5')
# [1] "aa" "2" "ss" "3" "d" "22" "f" "5"