import re
passes = ['a1!','4B_','*x7']
fails = ['ab!','BBB','*x_','a1!B']
rx = re.compile(r"""(?ax)
(?!(?:[\W\d_]*[^\W\d_]){2})
(?!(?:\D*\d){2})
(?!(?:[^!@\#$]*[!@\#$]){2})
[\w!@\#$]{3}""")
for s in passes:
print(s, ' should pass, result:', rx.fullmatch(s))
for s in fails:
print(s, ' should fail, reuslt:', rx.fullmatch(s))
aW1wb3J0IHJlCnBhc3NlcyA9IFsnYTEhJywnNEJfJywnKng3J10KZmFpbHMgPSBbJ2FiIScsJ0JCQicsJyp4XycsJ2ExIUInXQpyeCA9IHJlLmNvbXBpbGUociIiIig/YXgpCiAgKD8hKD86W1xXXGRfXSpbXlxXXGRfXSl7Mn0pCiAgKD8hKD86XEQqXGQpezJ9KQogICg/ISg/OlteIUBcIyRdKlshQFwjJF0pezJ9KQogIFtcdyFAXCMkXXszfSIiIikKZm9yIHMgaW4gcGFzc2VzOgoJcHJpbnQocywgJyBzaG91bGQgcGFzcywgcmVzdWx0OicsIHJ4LmZ1bGxtYXRjaChzKSkKZm9yIHMgaW4gZmFpbHM6CglwcmludChzLCAnIHNob3VsZCBmYWlsLCByZXVzbHQ6JywgcnguZnVsbG1hdGNoKHMpKQ==
a1! should pass, result: <re.Match object; span=(0, 3), match='a1!'>
4B_ should pass, result: <re.Match object; span=(0, 3), match='4B_'>
*x7 should pass, result: None
ab! should fail, reuslt: None
BBB should fail, reuslt: None
*x_ should fail, reuslt: None
a1!B should fail, reuslt: None