Для заголовка я ищу способ удалить начальный ноль с обеих сторон дефиса.

codes <- c("0002-01014", "0020-0014","00014-00010")
want <- c("2-1014","20-14","14-10")

Я предполагаю, что можно разделить числа на два, удалить ведущий ноль, а затем вставить вместе, но мне было интересно, есть ли более усовершенствованный метод, использующий один шаг из str_extract(), str_replace() и подобных.

Редактировать:

Я сейчас использую

str_split("0002-01010","-",simplify=T) %>%
  str_replace("^0+(?!$)", "") %>%
  str_c(collapse="-")

И было любопытно, есть ли альтернативный метод, который может быть реализован в одной строке.

2
aiorr 27 Янв 2021 в 23:18

2 ответа

Лучший ответ

Ты можешь использовать

codes <- c("0002-01014", "0020-0014","00014-00010", "00000-122345")
gsub("\\b0+\\B", "", codes, perl=TRUE)
# => [1] "2-1014"   "20-14"    "14-10"    "0-122345"

См. демонстрацию R и демонстрация регулярного выражения.

\b соответствует позиции между началом строки или символом, не являющимся словом, и символом слова, здесь, в начале строки или между - и следующей цифрой. 0+ соответствует одному или нескольким нулям, насколько это возможно. \B следит за тем, чтобы совпадение прекращалось перед цифрой, поэтому, если в номере только нули, последний остается неизменным.

3
Wiktor Stribiżew 27 Янв 2021 в 20:26

Вы также можете сопоставить и удалить нули в начале или после тире, но не в конце или перед тире:

codes <- c("0002-01014", "0020-0014","00014-00010", "00000-000330")
gsub("(^|-)0+(?!-|$)", "\\1", codes, perl=TRUE)

См R доказательство. См. доказательство регулярного выражения.

Объяснение выражения

--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    -                        '-'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  0+                       '0' (1 or more times (matching the most
                           amount possible))
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    -                        '-'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
--------------------------------------------------------------------------------
  )                        end of look-ahead
0
Ryszard Czech 27 Янв 2021 в 22:07
65926745