strsplit: разбить строки из целых чисел - PullRequest
1 голос
/ 11 апреля 2019

В настоящее время я пишу код для использования strsplit для отделения букв от целых чисел, как одна из моих экзаменационных сессий / практических занятий (в этом вопросе я не получил оценки, и я пока не смог понять концепцию).

Я пытался:

unlist(strsplit(s, "(?<=[a-zA-Z])(?=[0-9])"))

но это не работает.

также пробовал

unlist(strsplit(s, ""))

но это дает мне просто вектор char, по сути не отделяющий буквы от целых чисел.

Например, вместо "w17u2" становится "w", "1", "7", "u", "2" Мне нужно, чтобы оно было "w", "17", "u", "2".

Не будет никакого конкретного шаблона для ввода, поэтому он должен иметь возможность отделять буквы от целых чисел в любом шаблоне.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Можно использовать упреждения / упреждения

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 голос
/ 11 апреля 2019

Вы также можете использовать 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" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...