strsplit: разделение строк из целых чисел

#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"