Я думаю, что вы можете "кодировать" условия в одном регулярном выражении, оборачивая отдельные значения группами захвата, а затем использовать str_match
, чтобы фактически получить доступ к этим захватам, чтобы позже использовать их для создания столбцов:
library(stringr)
df <- data.frame(ID=c(1,2,3,4,5,6,7,8), UNIT=c("3ASD","3C14E","3D5E","3E15E","3ESK","3B14A","3BHHQ2","3E101"))
rx = "^([0-9][[:upper:]])([0-9]{1,3}|S[KD]|HH)([[:upper:]][0-9]*)?$"
match_table <- str_match(df$UNIT, rx)
df$C1 <- match_table[,2]
df$C2 <- match_table[,3]
df$C3 <- match_table[,4]
> df
ID UNIT C1 C2 C3
1 1 3ASD 3A SD <NA>
2 2 3C14E 3C 14 E
3 3 3D5E 3D 5 E
4 4 3E15E 3E 15 E
5 5 3ESK 3E SK <NA>
6 6 3B14A 3B 14 A
7 7 3BHHQ2 3B HH Q2
8 8 3E101 3E 101 <NA>
См. Демонстрационную версию regex .
Подробности
^
- начало строки ([0-9][[:upper:]])
- группа C1
: цифра, а затем заглавная буква ([0-9]{1,3}|S[KD]|HH)
- группа C2
: 1, 2 или 3 цифры или SK
, SD
или HH
([[:upper:]][0-9]*)?
- необязательная группа C3
: заглавная буква, за которой следуют 0+ цифр $
- конец строки,