Учитывая чудовищность a , которую могут сгенерировать эти требования, я подозреваю, что на самом деле вам будет лучше делать это как множественные проверки, что-то вроде (псевдокод ):
def check_password (s):
if len(s) < 8:
return false
rules_followed = 0
if match (s, "[a-z]") rules_followed++;
if match (s, "[A-Z]") rules_followed++;
if match (s, "[0-9]") rules_followed++;
if match (s, "[!$#%]") rules_followed++; # et cetera
if rules_followed < 3:
return false
return true
Скорее всего, это будет гораздо более читабельным, если кто-то другой должен будет поддерживать ваш код (или даже если вы должны поддерживать его через шесть месяцев).
Теперь я понимаю, что это не всегда возможно (например, вы можете застрять в структуре, которая допускает только одно регулярное выражение для проверки).
Но, если это возможно , я настоятельно рекомендую вам рассмотреть это. первая вещь, которую вы всегда должны оптимизировать, это удобочитаемость.
a Вы либо получите одно из этих огромных регулярных выражений, либо одно регулярное выражение, содержащее шестнадцать возможностей упорядочения, разделенных |
.
Ни один из них, вероятно, не будет столь же эффективным или читаемым, как простой сегмент кода.