import re
passes = [ 'a1!' , '4B_' , '*x7' ]
fails = [ 'ab!' , 'BBB' , '*x_' , 'a1!B' ]
rx = re .compile ( r"""
(?!(?:[\W \d _]*[^\W \d _]){2}) # no two letters allowed
(?!(?:\D *\d ){2}) # no two digits allowed
(?!(?:[^_!@\# $*]*[_!@\# $*]){2}) # no two special chars allowed
[\w !@\# $*]{3} # three allowed chars
""" , re .ASCII | re .VERBOSE )
for s in passes:
print ( s, ' should pass, result:' , bool ( rx.fullmatch ( s) ) )
for s in fails:
print ( s, ' should fail, reuslt:' , bool ( rx.fullmatch ( s) ) )
aW1wb3J0IHJlCnBhc3NlcyA9IFsnYTEhJywnNEJfJywnKng3J10KZmFpbHMgPSBbJ2FiIScsJ0JCQicsJyp4XycsJ2ExIUInXQpyeCA9IHJlLmNvbXBpbGUociIiIgogICg/ISg/OltcV1xkX10qW15cV1xkX10pezJ9KSAgICAgICMgbm8gdHdvIGxldHRlcnMgYWxsb3dlZAogICg/ISg/OlxEKlxkKXsyfSkgICAgICAgICAgICAgICAgICMgbm8gdHdvIGRpZ2l0cyBhbGxvd2VkCiAgKD8hKD86W15fIUBcIyQqXSpbXyFAXCMkKl0pezJ9KSAgIyBubyB0d28gc3BlY2lhbCBjaGFycyBhbGxvd2VkCiAgW1x3IUBcIyQqXXszfSAgICAgICAgICAgICAgICAgICAgIyB0aHJlZSBhbGxvd2VkIGNoYXJzCiAgIiIiLCByZS5BU0NJSSB8IHJlLlZFUkJPU0UpCmZvciBzIGluIHBhc3NlczoKCXByaW50KHMsICcgc2hvdWxkIHBhc3MsIHJlc3VsdDonLCBib29sKHJ4LmZ1bGxtYXRjaChzKSkpCmZvciBzIGluIGZhaWxzOgoJcHJpbnQocywgJyBzaG91bGQgZmFpbCwgcmV1c2x0OicsIGJvb2wocnguZnVsbG1hdGNoKHMpKSk=
stdout
a1! should pass, result: True
4B_ should pass, result: True
*x7 should pass, result: True
ab! should fail, reuslt: False
BBB should fail, reuslt: False
*x_ should fail, reuslt: False
a1!B should fail, reuslt: False