Попробуйте, это использует regexpr
, чтобы показать местоположение совпадения, и regmatches
, чтобы вернуть их, это очень восприимчиво, чтобы извлечь неверные данные.За квартал он вернет любой экземпляр 1-4, сопровождаемый или предшествующий q.Если есть какая-либо другая информация, которая может сделать эти более конкретные совпадения, чем я предлагаю, включив их.
input=c("aaaaaa-f2q09-bbbbb",
"aaaaaa-f2q2008-bbbbb",
"aaaaaa-f4q-2008-fffff",
"f4q-aaaaa-eeeeee-2008",
"q2-aaaaaaaaa-eeeeeee-2005",
"aaaaaaaa-3q-2008-rrrrrrr")
quarter=regmatches(input, regexpr("[1-4]q|q[1-4]", input))
year = regmatches(input, regexpr("q\\d{4}|q\\d{2}|\\d{4}", input))
year = gsub("q","",year)
year = sub("\\b(\\d{2})\\b","20\\1", year)
Существует также много проблем с сопоставлением года, потому что у вас есть три различных возможных формата "q09"," Q2008 "," 2008 ".Поскольку функция возвращает первое совпадение в строке, q \ d {4} требуется для возврата примера q2008.
Моя функция sub
здесь, которая соответствует регулярному выражению с 20 и самому соответствующему выражению, \\1
возвращает содержимое в скобках (\\d{2})
Проверьте это и прокомментируйте все ошибки