Вы можете использовать
library(stringr)
str_match(x, "(.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)")[, -c(1, 4)]
# [,1] [,2] [,3]
# [1,] "DEVICE PRF" ".75MG" "0.5ML"
# [2,] "DEVICE PRF" "1.5MG" "0.5MLX4"
# [3,] "CAP" "12-25MG" "30"
# [4,] "CAP DR" "60MG" "100UD 3270-33 (32%)"
Предполагая, что вторая / средняя часть всегда заканчивается MG или ML и не имеет пробелов.
Шаблон (.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)
можно прочитать следующим образом: первая совпадающая часть содержит что-либо + хотя бы один пробел + вторая часть для сопоставления, заканчивающаяся в MG или ML + хотя бы один пробел + третья часть для сопоставления, содержащая что-либо.