Вероятно, было бы проще и понятнее проверить каждое правило отдельно
def validate_password(password: str) -> bool:
return bool(
len(password) >= 4 and
and re.search(r'[a-z]', password)
and re.search(r'[A-Z]', password)
and re.search(r'[0-9]', password)
and not re.search(r'[^a-zA-Z0-9]', password) # exclude non alphanumeric
)
В противном случае вы могли бы использовать отрицательное прогнозное утверждение
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?!.*[^a-zA-Z0-9]).{4,}$