Используя stringr
, есть несколько опций:
dat <- data.frame(my_string = "ID-XXXXX Process for Description [1/5]")
dat %>%
mutate(A = str_extract(string = my_string, pattern = "ID-.{5}"),
B = str_replace(string = my_string, pattern = "ID-.{5}\\s(.+)\\s\\[.*\\]", replacement = "\\1"),
C = str_match(string = my_string, pattern = "\\[(.*)\\]")[2])
A: извлечь следующий шаблон: ID-
, за которым следуют ровно 5 символов
B: захват группы между ID-XXXXX
и [X-X]
и замените весь шаблон захваченным шаблоном
C: соответствует захваченному шаблону (.*)
в квадратных скобках (2-й столбец str_match
возвращает захваченный шаблон)
Результат:
my_string A B C
1 ID-XXXXX Process for Description [1/5] ID-XXXXX Process for Description 1/5
РЕДАКТИРОВАТЬ :
Я только что вспомнил, что функция extract()
из tidyr
делает именно это.
Использование групп захвата между круглыми скобками в regex
аргумент, вы получаете их в новые столбцы напрямую.
dat <- data.frame(my_string = paste0("ID-0000", 1:5, " Process_", LETTERS[1:5], " [", 1:5, "/5]"))
extract(data = dat,
col = my_string,
into = c("A", "B", "C"),
regex = "(ID-.{5})\\s(.+)\\s\\[(.*)\\]",
remove = FALSE)
my_string A B C
1 ID-00001 Process_A [1/5] ID-00001 Process_A 1/5
2 ID-00002 Process_B [2/5] ID-00002 Process_B 2/5
3 ID-00003 Process_C [3/5] ID-00003 Process_C 3/5
4 ID-00004 Process_D [4/5] ID-00004 Process_D 4/5
5 ID-00005 Process_E [5/5] ID-00005 Process_E 5/5
Если вы не хотите сохранять исходную строку, используйте remove = TRUE
.