Well this seems to be working so far for these specific examples, but like I said in comments above you need to be sure about the data so don't trust this too much without more extensive testing. I have an NDC table and did some checking and it seems that the concentration is first in the description but I didn't check each and every code so test very carefully!
The regex puts parens around groups to be remembered, which are read from left to right and the first and second remembered groups are returned. It can be read as: Starting at the beginning of the line, look for one or more characters that are not a digit, followed by one or more digits, then an optional decimal point and zero or more digits, followed by zero or more spaces, then one of the optional measures (pipe is a logical OR), then an optional "/ML", then the rest of the string.
SQL> with tbl(drug_name) as (
select 'CYCLOSPORINE 100MG 30 CAPS' from dual union
select 'TERBUTALINE 2.5MG 100 TABS' from dual union
select 'TESTOSTERONE CYP 200MG/mL 10ML VIAL C3' from dual union
select 'GEMCITABINE 1 GM-26.3 ML VL' from dual union
select 'NOREPINEPHRINE 1MG/mL 4mL 10 AMP' from dual union
select 'AMOXI-DROP (50MG)' from dual union
select 'DARVOCET-N 100 TABLET' from dual union
select 'ALBON ORAL SUSP 5% 16OZ' from dual
)
select drug_name,
regexp_replace(upper(drug_name), '^\D+(\d+\.?\d*) *((GM|ML|MG|OZ|LB|%)?(/ML)?).*$', '\1\2') CONCENTRATION
from tbl;
DRUG_NAME CONCENTRATION
-------------------------------------- ------------------------------
ALBON ORAL SUSP 5% 16OZ 5%
AMOXI-DROP (50MG) 50MG
CYCLOSPORINE 100MG 30 CAPS 100MG
DARVOCET-N 100 TABLET 100
GEMCITABINE 1 GM-26.3 ML VL 1GM
NOREPINEPHRINE 1MG/mL 4mL 10 AMP 1MG/ML
TERBUTALINE 2.5MG 100 TABS 2.5MG
TESTOSTERONE CYP 200MG/mL 10ML VIAL C3 200MG/ML
8 rows selected.
SQL>
Notes:- If the regex does not find a match, the DRUG_NAME column will be returned.
- Since you upshift the drugname, the original 'mL' spelling becomes 'ML'.
Technically it's the same thing but you are altering data which may matter to the
consumers of the data.
- Some drug names like the DARVOCET example don't seem to have a measure in the
description. You need to decide if that's ok.
- The space between the number and measure is removed.
Oh and I used REGEXP_REPLACE as it allows referring to multiple saved groups with the '\1' shorthand where REGEXP_SUBSTR does not allow that (only 1 subgroup).