Use the built-in character sets in the module 'string'.
Example: 'any(c in string.ascii_lowercase for c in password)' is true when there is a lowercase letter in password. You can use a similar technique with symbols even though they don't have their own string in the module, by first checking for everything else.
First check the more common combinations. Only numbers, then only lowercase letters, then both, and so on. Within the user's wishes, of course.
- Long strings are often better assigned to a variable outside the main logic of the program and then inserted when needed. Appropriate naming of the variables is important.
Nice project. I especially like the different responses to questions.