Я никогда не использовал R, но имел большой опыт с регулярными выражениями.
Идиоматически правильный способ заключается в использовании соответствия.
Для R должно быть regmatches:
Использование regmatches получить фактические подстроки, совпавшие с регулярным выражением . В качестве первого аргумента передайте тот же ввод, который вы передали в regexpr или gregexpr. В качестве второго аргумента передайте вектор , возвращаемый regexpr или gregexpr. Если вы передадите вектор из regexpr , то regmatches вернет вектор символов со всеми строками, которые были сопоставлены . Этот вектор может быть короче входного вектора, если в некоторых элементах найдено совпадение . Если вы передадите вектор из regexpr, то regmatches вернет вектор с таким же числом элементов в качестве входного вектора. Каждый элемент является символьным вектором с всеми совпадениями соответствующего элемента во входном векторе или NULL, если элемент не имеет совпадений.
>x <- c("abc", "def", "cba a", "aa")
> m <- regexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[1] "a" "a" "aa"
В случае, вы должны быть:
m <- regexpr("\d{4}", year1, perl=TRUE)
regmatches(year1, m)
В случае, если вы можете иметь еще 4 цифры подряд в одной и той же строки, вы можете использовать non capturing groups. Возможно, как это:
"(?:_)\d{4}(?:_)"
К сожалению, нет возможности проверить все это в R.
Обратите внимание, что ваше регулярное выражение в GSUB соответствует каждому символу, который не является цифрой и удаляет его от входа. Вот почему у вас были все цифры от ввода слева в результате. –