Использование gsub для поиска и замены регулярным выражением

#regex #r #gsub

#регулярное выражение #r #gsub

Вопрос:

У меня есть данные, которые находятся в символьном векторе формата:

 "2014-03-27 11:42:32" "2014-04-03 07:13:28" "0000-00-00 00:00:00" "2012-04-16 12:46:03"
[5] "0000-00-00 00:00:00" "0000-00-00 00:00:00" "2014-04-23 09:33:23" "2014-04-30 06:31:54"[9] "2012-04-18 09:55:44" "2013-11-20 14:43:11" 
  

То, что я хочу сделать, это использовать одно число за год. Т.Е. 4 для 2014, 3 для 2013, 2 для 2012 и 1 для 0000-00… Помимо единственного числа, представляющего год, я хотел бы удалить все остальные цифры и символы.

Я знаю, что могу использовать регулярное выражение и gsub(pattern="2014", replacement="4", logVector) / или некоторые варианты для выполнения своей задачи, но я не очень хорошо разбираюсь в регулярных выражениях. Кто-нибудь сможет оказать помощь в синтаксисе?

Комментарии:

1. "2014-03-27 11:42:32" является одной строкой

2. Вы действительно должны сохранить формат даты здесь

Ответ №1:

Это то, что вам нужно:

 sub("^\d{3}(\d).*", "\1", subject, perl=TRUE);
  

Нам нужно записать последнюю цифру года, а затем заменить всю строку этой цифрой.

Объяснение

  • ^ Привязка утверждает, что мы находимся в начале строки
  • d{3} соответствует трем цифрам
  • (d) сопоставляет четвертую цифру и записывает ее в группу 1
  • .* соответствует концу строки
  • 1 заменяет всю строку группой 1, которая является последней цифрой.

Ответ №2:

Это шаблон, который вы ищете:

 gsub("^2014.*", "4", data) 
  

Это немного более расширенное выражение и заменит годы с 2011 по 2019 год соответствующей цифрой, хотя вам нужно будет запустить вторую строку, чтобы разобраться со случаем 0000.

 gsub("^201([1-9]).*", "\1", data)
gsub("^0000.*", "0", data)
  

Ответ №3:

Вы также можете использовать ?substr для извлечения 4-го символа в дополнение к

 substr(data,4,4)
# [1] "4" "4" "0" "2" "0" "0" "4" "4" "2" "3"
  

или

  library(stringr)
  str_extract(data, perl('(?<=\d{3})\d')) 
 #[1] "4" "4" "0" "2" "0" "0" "4" "4" "2" "3"
  

Объяснение

 (?<=d{3}) # look behind for three digits
d # followed by the digit that needs to be extracted
  

Предположим, вам нужны месяцы:

 str_extract(data, perl('(?<=\d{4}-)\d{2}')) #look behind 4 digits followed by `-`
#[1] "03" "04" "00" "04" "00" "00" "04" "04" "04" "11"