如何检查"密码"对于python中的数字

时间:2017-01-30 17:02:05

标签: python

我已经设置了一个程序来更改密码"。我检查它是否至少8个字符,包含大写字母并有一个数字,如果它不符合这个标准,它再次要求输入密码。除了检查号码外,我还有一切工作,我想知道是否有人可以提供帮助。

Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim WSP1 As Worksheet
Set con = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset

Application.DisplayStatusBar = True
Application.StatusBar = "Contacting SQL Server..."

' Remove any values in the cells where we want to put our Stored Procedure's results.
Dim rngRange As Range
Set rngRange = Range(Cells(8, 2), Cells(Rows.Count, 1)).EntireRow
rngRange.ClearContents

' Log into our SQL Server, and run the Stored Procedure
con.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;Trusted_Connection=Yes;"
cmd.ActiveConnection = con

' Set up the parameter for our Stored Procedure
' (Parameter types can be adVarChar,adDate,adInteger)
cmd.Parameters.Append cmd.CreateParameter("CustomerID", adVarChar, adParamInput, 10, Range("D2").Text)

Application.StatusBar = "Running stored procedure..."
cmd.CommandText = "SP_GetOrdersForCustomer"
Set rs = cmd.Execute(, , adCmdStoredProc)

' Copy the results to cell B7 on the first Worksheet
Set WSP1 = Worksheets(1)
WSP1.Activate
If rs.EOF = False Then WSP1.Cells(8, 2).CopyFromRecordset rs

rs.Close
Set rs = Nothing
Set cmd = Nothing

con.Close
Set con = Nothing

Application.StatusBar = "Data successfully updated." 

5 个答案:

答案 0 :(得分:2)

您正在检查密码本身是完全大写还是由数字组成。您需要检查密码中的字符是否符合此条件。

has_upper = any([c.isupper() for c in npwc])
has_digit = any([c.isdigit() for c in npwc])

您还可以使用正则表达式。

顺便说一下,您应该更喜欢getpass来获取用户的密码。

答案 1 :(得分:1)

您是否考虑过使用.isalnum()?

>>> foo =  "123asd"
>>> foo
'123asd'
>>> foo.isalnum()
True
>>> 

编辑:从其他答案来看,我不确定你在寻找什么,可以用例子解释一下吗?

答案 2 :(得分:1)

这可以变得更紧凑但是啊..

while True:    
    npw = input("Please enter new password.")
    npwc = input ("Please confirm new password")    
    if npwc == npw:
        if any(x.isupper() for x in npwc):
            if any(x.islower() for x in npwc):
                if len(npwc) >= 8:
                    if any (x.isdigit() for x in npwc):
                        npw=npwc
                        print("Your password has been changed")
                        #break  # you probably want to exit the loop at this point
                    else:
                        print("Your password must contain a number")
                else:
                    print("Your password must contain at least 8 characters.")
            else:
                print("Your password must contain at least 1 upper case character.")
        else:
            print("Your password must contain at least 1 lower case character.")
    else:
        print("Passwords don't match")

答案 3 :(得分:1)

我建议使用sets和stdlib中的字符串包作为可接受字符列表。

我还建议重构一下以删除大量if / else分支的嵌套。

import string
upper = set(list(string.uppercase))
lower = set(list(string.lowercase))
numbers = set(list(string.digits))

while True:

    npw = input("Please enter new password: ")
    npwc = input("Please confirm new password: ")

    if npwc != npw:
        print("Passwords don't match")
        continue

    if len(npcw) < 8:
        print("Your password must contain at least 8 characters.")
        continue

    chars = set(list(npwc))

    if not upper.intersection(chars):
        print("Your password must contain at least 1 upper case character.")
        continue

    if not lower.intersection(chars):
        print("Your password must contain at least 1 lower case character.")
        continue

    if not numbers.intersection(chars):
        print("Your password must contain a number")
        continue

    npw = npwc
    print("Your password has been changed")
    break

答案 4 :(得分:0)

这看起来像正则表达式的工作。解决方案如下:

import re

def password_validator(password):
    if len(password) < 8:
        return False, "Your password must contain at least 8 characters"
    if not re.match('.*[0-9]', password):
        return False, "Your password must contain a number"
    if not re.match('.*[A-Z]', password):
        return False, "Your password must contain at least 1 upper case character."
    if not re.match('.*[a-z]', password):
        return False, "Your password must contain at least 1 lower case character." 
    return True, "Your password has been changed"

while True:
    npw = input("Please enter new password.")
    npwc = input("Please confirm new password")
    if npw != npwc:
        print("Passwords don't match")
        continue

    is_valid, message = password_validator(npw) 
    print(message)
    if is_valid:
        break

你也可以一次性验证整个事情:

pattern = """
(?=.*[a-z]) # use positive lookahead to see if at least one lower case letter exists
(?=.*[A-Z]) # use positive lookahead to see if at least one upper case letter exists
(?=.*\d)    # use positive lookahead to see if at least one digit exists
[A-Za-z0-9@#$%^&+=]{8,}  # match any character in [] at least 8 times
"""
pwd_validator = re.compile(pattern, re.VERBOSE)    
if pwd_validator.match(password):
    # legit password
else:
    # no match ask again

希望这会有所帮助。 re.VERBOSE只是使这个正则表达式自我记录,以便将来更容易理解。