Помимо негативного взгляда, вы могли бы просто "изложить", что вы хотите иметь:
r'[12356789]\d{0,4}'
будет соответствовать от 1 до 9 (без 4 или от 0), за которыми следуют до 4 цифр.
Пример:
import re
i = 0
for k in range(1,99999):
if re.match(r'[12356789]\d{0,4}',str(k)):
# print(k)
i += 1
print(i) # 88887
Он доставляет вам 88887 матчей, потому что:
range(1,99999) (max excluded) = 99998 values
4 = 1 value
40,41,42, ..., 49 = 10 values
400,401,402, ..., 499 = 100 values
4000,4001,4002, ..., 4999 = 1000 values
40000,40001,40002, ..., 49999 = 10000 values
99998 - 1 - 10 - 100 - 1000 - 10000 = 88887