I don't know is it worth it, but it is possible.
Try with:
(12.(3[3-9]|[4-9]\d))|(13(.([0-3]\d|4[01]))?)
it means:
- 12.-- starts with '12.',
- 3[3-9]-- 3 followed by digit from range 3 to 9 (33-39),
- |-- OR
- [4-9]\d-- digit from range 4 to 9 followed by any digit (40-99),
- |-- OR
- 13-- starts with '13'
- .-- dot
- [0-3]\d-- digit from range 0 to 3 followed by any digit,
- |-- OR
- 4[01]-- 4 followed by 0 or 1,
- ?-- zero or one time
and (.([0-3]\d|4[01]))? is treated as a one group, to allow '13', but not '13.'
It will match numbers like: 12.33, 12.99, 13.41 ,13 ,12.41 ,13.39 ,etc. 
and will ignore:  12.32, 13.42, etc.
Your code didn't work because:
(12.[3-9][3-9]|13.?[0-4][0-1]?)\d{0,2}
- [3-9][3-9]- allows only numbers from ranges (33-39,43-49,53-59,...),
- [0-4][0-1]- allows only numbers (00,01,10,11,20,21,30,31,40,41),
so there is huge omitted range