Ваше регулярное выражение верно.Скорее проблема заключается в коде, который следует за ним: вы выравниваете список (и, таким образом, теряете соответствие между числами и исходной строкой), а затем конвертируете выходные данные в числа, даже если указали, что хотитеполучить строку .
Итак, начните с удаления шагов %>% unlist %>% as.numeric
.
Далее, есть хитрый трюк для объединения списка строк в одну запятуюстрока с разделителями: toString
.Поэтому примените это к списку результатов:
name %>% stringr::str_match_all("[0-9]+") %>% sapply(toString)
И вот оно у нас.
Кроме того, вы можете упростить регулярное выражение: \d
идентично [0-9]
;давая нам:
name %>% stringr::str_match_all("\\d+") %>% sapply(toString)
И, наконец, ваш «ожидаемый результат» совершенно неверен, потому что вы неверно истолковываете значение escape-последовательности обратной косой черты в строке. Прочитайте документацию по escape-последовательностям строк .
В качестве альтернативы, вместо сопоставления всех цифр, вы можете сделать наоборот: сопоставить все, что не цифру, и заменить такие прогонына ', '
.Однако затем вам нужно будет удалить начальные и конечные запятые:
trimws(gsub('\\D+', ', ', name), whitespace = ', ')