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