Как удалить символ r из приглашения getpass

#python #regex #getpass

#python #регулярное выражение #getpass

Вопрос:

Я написал код, который фактически соответствует регулярному выражению patter в Python. Я использовал библиотеку getpass, чтобы предложить пользователю ввести пароль.Но если пользователь вводит неправильный пароль [скажите ‘HH’ — это неверный пароль].Как только пользователь нажимает enter после ввода пароля, get pass принимает «HH» и «введите как r» [два разных ввода]. Теперь мне нужен способ узнать, как отделить ‘ r’ от передачи в качестве входных данных.

Я пытался использовать функцию strip для удаления ‘ r’, но безуспешно

 import getpass
import re
loopVar=True

while loopVar:

    password = getpass.getpass("Enter your password: ")
    password.rstrip('r')
    pattern=re.match(r'(?=.{5,32}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9])',password)

    if pattern:
        print ("The password mateches as per standards")
        loopVar=False
    else:
        print ("The password "  password  " is not as per rules ")
  
 Enter your password:
The password hh is not as per rules
Enter your password:(this is taking r as input character and I dont need this)
The password  is not as per rules

Enter your password:[Prompting user to input]
  

Комментарии:

1. Возможно, добавьте еще один отрицательный прогноз, чтобы утверждать, что не может быть пробельного символа (?!.*s)

2. Если вы хотели добавить отрицательный прогноз в шаблон reg ex , я пытался, но не сработало . Спасибо за предложение

Ответ №1:

Вы слишком близко 🙂

измените свой код с:

 password.rstrip('r')
  

Для

 password = password.rstrip('r')
  

Объяснение:
из документов python,

str.rstrip([символы]): возвращает копию строки с удаленными конечными символами.

поскольку строка неизменяема в python, вам нужно снова назначить эту копию вашей переменной

Редактировать: отвечая на проблему получения двойных записей, когда пользователь вводит пароль и нажимает enter, одна запись содержит строку пароля, а вторая — пустой код ввода ‘ r’, вы можете добавить оператор if, чтобы отфильтровать второй пример ввода:

 password = getpass.getpass("Enter your password: ")

if password != 'r':  # filter out echo input
    password.rstrip('r')
    pattern=re.match(r'(?=.{5,32}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9])',password)

    if pattern:
        print ("The password mateches as per standards")
        loopVar=False
    else:
        print ("The password "  password  " is not as per rules ")
  

Комментарии:

1. Спасибо, приятель!!! Но все же я сталкиваюсь с той же проблемой. Он все еще принимает ввод в качестве нового ввода

2. вы имеете в виду, что хотите пренебречь вводом только ввода, т. Е. Если пользователь нажал Enter с пустым паролем?

3. @Akash я отредактировал ответ, посмотрите, решает ли он вашу проблему с получением дополнительного ввода в качестве нового ввода

4. Я все еще вижу, что r принимается в качестве входных данных… Я не уверен, почему эта дополнительная команда [‘ r’ в данном случае ] выполняется автоматически. Введите свой пароль: пароль dd не соответствует правилам Введите свой пароль: Пароль не соответствует правилам Введите свой пароль: [запрашивает agian для ввода допустимого ввода] Это то, что я вижу…