This regex should do your job.
^(?:[1-9][0-9]*|0)(?:\.[0-9]+)?$
Demo
^ - Start of string
(?: - Beginning of a non-capture group
[1-9][0-9]* - Matches a number not starting with a zero
|0 - Or allows matching only a zero to allow numbers like 0.3423434 or 0.1
(?:\.[0-9]+)? - Optionally allows a decimal part in the number
$ - End of string
Edit: Based on Allan's suggestion to use \d instead of [0-9]
In case your input only contains English numbers, or when you only intend to match English numbers, then using [0-9] should be preferred for reasons like better performance and wide supported of it across regex engines.
But in case your input contains digits from other languages like Hindi १ २ etc. and you want to match any digits, then \d should be preferred instead of [0-9]
^(?:0\.\d*[1-9]\d*|[1-9]\d*(?:\.\d+)?)$demo