【问题标题】:In python, how do you check if a string has both uppercase and lowercase letters在python中,如何检查字符串是否同时包含大写和小写字母
【发布时间】:2016-10-12 05:26:03
【问题描述】:

我查看了与我的问题Password check- Python 3 类似的另一篇文章,除了我的问题涉及检查密码是否同时包含大写和小写问题。我的代码如下,但执行时无法识别密码中的大小写字母,它只能识别一种类型。我如何让它识别这两种类型?还有一种更简单的方法可以让代码检查是否所有这些值都发生了,而不必为每个单独的步骤创建函数?

def Get_Password():
    return input("Enter your desired password: ")

def Count_Digits(password):
    return sum(character.isdigit() for character in password)

def Valid_password_length(password):
    if len(password) >= 10:
        return ('step1' == True)
    else:
        return ('step1' == False, print("Invalid password: too short"))

def Valid_password_characters(password):
    if password.isalnum():
        return ('step2' == True)
    else:
        return ('step2' == False, print("Invalid password: illegal character detected"))

def Valid_password_numdigit(password):
    if Count_Digits(password) >= 2:
        return ('step3' == True)
    else:
        return ('step3' == False, print("Invalid password: Must have at least 2 digits"))

def Valid_password_lowercase(password):
    for i in (password):
        if i.islower() == True:
            return ('step4' == True)
        else:
            return ('step4' == False, print("Invalid password: No lowercase characters detected"))

def Valid_password_uppercase(password):
    for i in (password):
        if i.isupper() == True:
            return ('step5' == True)
        else:
            return ('step5' == False, print("Invalid password: No uppercase characters detected"))

def password_checker():
    password = Get_Password()
    Valid_password_length(password)
    Valid_password_characters(password)
    Valid_password_numdigit(password)
    Valid_password_lowercase(password)
    Valid_password_uppercase(password)

    if 'step1' and 'step2' and 'step3' and 'step4' and 'step5' == True:
        print("Congratulations! This password is valid")

password_checker()

【问题讨论】:

  • 你为什么有return ('stepX' == True)?这与return False 相同,因为字符串不等于任何布尔值。
  • 您也在 False 情况下返回元组。除此之外,您甚至不需要检查函数的返回值。

标签: python string


【解决方案1】:
import sys

def Valid_password_mixed_case(password):
    letters = set(password)
    mixed = any(letter.islower() for letter in letters) and any(letter.isupper() for letter in letters)
    if not mixed:
        print("Invalid password: Mixed case characters not detected", file=sys.stderr)
    return mixed

一个完整的解决方案:

import sys

def Get_Password():
    return input("Enter your desired password: ")

def Count_Digits(password):
    return sum(1 for character in password if character.isdigit())

def Valid_password_length(password):
    correct_length = len(password) >= 10

    if not correct_length:
        print("Invalid password: too short", file=sys.stderr)

    return correct_length

def Valid_password_characters(password):
    correct_characters = password.isalnum()

    if not correct_characters:
        print("Invalid password: illegal character detected", file=sys.stderr)

    return correct_characters

def Valid_password_numdigit(password):
    sufficient_digits = Count_Digits(password) >= 2

    if not sufficient_digits:
        print("Invalid password: Must have at least 2 digits", file=sys.stderr)

    return sufficient_digits

def Valid_password_mixed_case(password):
    letters = set(password)

    lower = any(letter.islower() for letter in letters)
    upper = any(letter.isupper() for letter in letters)

    if not upper:
        print("Invalid password: No uppercase characters detected", file=sys.stderr)

    if not lower:
        print("Invalid password: No lowercase characters detected", file=sys.stderr)

    return lower and upper

def password_checker():
    password = Get_Password()
    if Valid_password_length(password) and \
        Valid_password_characters(password) and \
        Valid_password_numdigit(password) and \
        Valid_password_mixed_case(password):

        print("Congratulations! This password is valid")

password_checker()

【讨论】:

    【解决方案2】:

    您的问题很容易回答。您正在返回 return('steps' == True) 形式的东西,它总是会返回 false。因此,只需将它们替换为 return Truereturn False

    假设您修复了上述问题,您的循环也是错误的。您只想在遍历整个字符串后返回 false。考虑密码:ABCd。这包含一个小写字符,但您的 check lowercase 方法将返回 false,因为第一个字母是大写的。您想查看密码中的每个字符,如果这些字符都不是小写,则返回 false。

    如果您想要一种更简洁的方式,cdlane's answer 是一种不错的 Python 方式。

    【讨论】:

      【解决方案3】:

      回答标记为重复的问题Break line not executing

      password = input('Enter your password')
      password_letters = list(password)
      upper = False
      lower = False
      name = 'Papa'
      surname = 'Johns'
      
      for letter in password_letters:
          if letter.isupper():
              upper = True
          elif letter.islower():
              lower = True
      
          if upper and lower:
              break
      
      if len(password) <= 5:
          print('password is to short')
      elif name.lower() in password.lower() or surname.lower() in password.lower():
          print('You cannot have first or last name in password')
      elif not (upper and lower):
          print('You must have both upper and lower case in password')
      else:
          print('Password is valid')
      

      【讨论】:

      • 如果letter 不是字母怎么办?你的代码将lower 标记为True
      【解决方案4】:

      你可以使用正则表达式:

      即:

      def Valid_mixed_password(password):
          lower = re.compile(r'.*[a-z]+') # Compile to match lowercase
          upper = re.compile(r'.*[A-Z]+') # Compile to match uppercase
          if lower.match(password) and upper.match(password): # if the password contains both (lowercase and uppercase letters) then return True
              return True
          else: # Else, the password does not contains uppercase and lowercase letters then return False
              return False
      
      >>> print Valid_mixed_password("hello")
      False
      >>> print Valid_mixed_password("HELLO")
      False
      >>> print Valid_mixed_password("HellO")
      True
      >>> print Valid_mixed_password("heLLo")
      True
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-06
        • 2017-03-13
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        相关资源
        最近更新 更多