Python Цикл через input (). Split () - PullRequest
2 голосов
/ 17 марта 2019

Я пытаюсь написать код, который проверяет, соответствует ли введенный пароль критериям, приведенным ниже.


  1. Как минимум 1 буква между [a-z]
  2. Как минимум 1 число между [0-9]
  3. Как минимум 1 буква между [A-Z]
  4. Как минимум 1 символ из [$ # @]
  5. Минимальная длина пароля транзакции: 6
  6. Максимальная длина пароля транзакции: 12

Вывод и скриншот кода

import re
tmp=[]
for i in input().split(','):
  print(i)
  upp=0
  low=0
  dig=0
  sch=0
  for j in i:
    if j.isdigit() and dig!=1:
      dig=1
    elif j.isupper() and upp!=1:
      upp=1
    elif j.islower() and low!=1:
      low=1
    elif re.search("[$#@]",j) and sch!=1:
      sch=1
    elif dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
      tmp+=[i]
      print(i)
      print(tmp)
print(','.join(tmp))

Контрольный пример

Это @ МЕ1, notThis, Fine @ 3456, & 1234567sdfD

Кажется, он проходит через один из тестов трижды?

Вывод выглядит так:

This@me1
notThis
Fine@3456
Fine@3456
['Fine@3456']
Fine@3456
['Fine@3456', 'Fine@3456']
Fine@3456
['Fine@3456', 'Fine@3456', 'Fine@3456']
&1234567sdfD
Fine@3456,Fine@3456,Fine@3456

Не совсем уверен, что является причиной этого. Почему трижды запускается дело Fine @ 3456? Кроме того, я не понимаю, почему первый случай This @ me1 также не распознается как действительный.

Любая помощь будет высоко ценится!

Примечание: я запускаю этот код на сайте repl.it: https://IroncladSoulfulKiskadee.yashvedi.repl.run <- для запуска теста </p>

Python 3.6.1 (по умолчанию, декабрь 2015 г., 13:05:11) [GCC 4.8.2] в Linux

пс. Пожалуйста, игнорируйте избыточность в коде;

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 марта 2019
elif dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
  tmp+=[i]

Это не происходит в нужном месте.Рассмотрим пароль This@me1.На последней итерации внутреннего цикла мы выполним

if j.isdigit() and dig!=1:
  dig=1

, а затем ничего из elif не пройдёт (включая вашу последнюю проверку).

Проблема с Fine@3456 запуск три раза связан с очень похожей проблемой.

Исправление:

for j in i:
    if j.isdigit() and dig!=1:
      dig=1
    elif j.isupper() and upp!=1:
      upp=1
    elif j.islower() and low!=1:
      low=1
    elif re.search("[$#@]",j) and sch!=1:
      sch=1
if dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
  tmp+=[i]

Проверьте, выполняется ли условие после того, как вы проверили все.

(Ирассмотрите возможность использования True и False вместо 1 и 0. Вот почему они там.)

0 голосов
/ 17 марта 2019

Возможно, вместо проверки всех слов в цикле символы делают что-то вроде этого (это более читабельно):

import re
tmp=[]
for i in input().split(','):
  if not (6 <= len(i) <= 12):
    continue
  if not re.search("[$#@]", i):
    continue
  if not re.search("[a-z]", i):
    continue
  if not re.search("[A-Z]", i):
    continue
  if not re.search("[0-9]", i):
    continue
  tmp.append(i)
print(','.join(tmp))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...