fork(1) download
  1. import re
  2. passes = ['a1!','4B_','*x7']
  3. fails = ['ab!','BBB','*x_','a1!B']
  4. rx = re.compile(r"""(?ax)
  5. (?!(?:[\W\d_]*[^\W\d_]){2})
  6. (?!(?:\D*\d){2})
  7. (?!(?:[^!@\#$]*[!@\#$]){2})
  8. [\w!@\#$]{3}""")
  9. for s in passes:
  10. print(s, ' should pass, result:', rx.fullmatch(s))
  11. for s in fails:
  12. print(s, ' should fail, reuslt:', rx.fullmatch(s))
Success #stdin #stdout 0.02s 9676KB
stdin
Standard input is empty
stdout
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