Ваше регулярное выражение regexp
в порядке, оно соответствует только одному вхождению. Если вы хотите соответствовать каждому вхождению, попробуйте
"x : in integer; y : in logic; z : in float;".scan(regexp)
, что приводит к массиву из 3 элементов, содержащему массив из 3 совпадений, т.е.
[ ["x", "in", "integer"], ["y", "in", "logic"], ["z", "in", "float"] ]