#r
#r
Вопрос:
В настоящее время я пишу код для использования strsplit для отделения букв от целых чисел в качестве одной из моих практических / учебных сессий (по этому вопросу не оценено, и я пока не смог понять концепцию).
Я пытался:
unlist(strsplit(s, "(?<=[a-zA-Z])(?=[0-9])"))
но это не работает.
также пробовал
unlist(strsplit(s, ""))
но это дает мне просто вектор char
, по существу не отделяя буквы от целых чисел.
Например, вместо "w17u2"
того, чтобы становиться "w"
, "1"
, "7"
, "u"
, "2"
мне нужно, чтобы это было "w"
, "17"
, "u"
, "2"
.
Для ввода не будет какого-либо определенного шаблона, поэтому он должен иметь возможность отделять буквы от целых чисел по любому шаблону.
Ответ №1:
Одним из вариантов является использование look-aheads / look-behinds
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)
строка разбивается на позиции, где предыдущий символ соответствует цифре, а следующий символ не соответствует цифре. Конечным регулярным выражением является объединение ИЛИ обоих шаблонов регулярных выражений.
Ответ №2:
Вы также можете использовать 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"