Как расширить заданный диапазон чисел, чтобы включить все числа, разделенные тире - PullRequest
3 голосов
/ 20 мая 2019

Я пытаюсь расширить диапазон чисел, в настоящее время разделенных тире, чтобы включить все числа.

Хорошей новостью является то, что я нашел код (не мой), который помог со следующей конфигурацией:

"Бальный зал 1-3" дает "Бальный зал 1, Бальный зал 2, Бальный зал 3", что я и хочу. Проблема в том, что это обусловлено отсутствием пробелов до и после тире. В настоящее время "Бальный зал 1 - 3" возвращает "Бальный зал 1 -3, Бальный зал 1 - 3, Бальный зал 1 - 3"; что не является желаемым выходом.

Обратите внимание, что по нескольким причинам пробелы до и после тире должны быть сохранены. Ввод "Бального зала 1 - 3" должен оставаться прежним.

## Dealing with Dash Seperated Sequences of Numbers

expand.dash <- function(dashed) {
  limits <- as.numeric(unlist(strsplit(dashed, '-')))
  seq(limits[1], limits[2])
}


expand.ballrooms <- function(txt) {
   str <- gsub('\\d+-\\d+', '%d', txt)
  dashed_str <- gsub('[a-zA-Z ]+', '', txt)
  sprintf(str, expand.dash(dashed_str))
}

expand.ballrooms("Ballroom 1-3")  
# this works but the line below fails to output the desired result 

expand.ballrooms("Ballroom 1 - 3")
# Result should be identical to the the output returned by the previous line. 

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2019

In expand.ballrooms изменить это

gsub('\\d+-\\d+', '%d', txt)

на это:

gsub('\\d+\\s*-\\s*\\d+', '%d', txt)

0 голосов
/ 20 мая 2019

Вы можете добавить дополнительный пробел в шаблоне в gsub в функции expand.ballrooms

gsub('\\d+\\s?-\\s?\\d+', '%d', txt)

Измененная функция будет

expand.dash <- function(dashed) {
  limits <- as.numeric(unlist(strsplit(dashed, '-')))
  seq(limits[1], limits[2])
}


expand.ballrooms <- function(txt) {
  str <- gsub('\\d+\\s?-\\s?\\d+', '%d', txt)
  dashed_str <- gsub('[a-zA-Z ]+', '', txt)
  sprintf(str, expand.dash(dashed_str))
}

и теперь это будет работать в обоих случаях

expand.ballrooms("Ballroom 1-3")
#[1] "Ballroom 1" "Ballroom 2" "Ballroom 3"

expand.ballrooms("Ballroom 1 - 3")
#[1] "Ballroom 1" "Ballroom 2" "Ballroom 3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...