所有这些IF和None都是处理RE的最佳方式吗?

时间:2017-06-14 15:24:46

标签: python regex

我一直在尝试创建自己的,非常简单的程序来检查用户复制的文本字符串是否可以被视为强密码,基于常规的展示。在程序中,我想要一个强密码被认为至少有8个字符,至少有一个低位和一个大写字符,还有至少一个数字。

我写的代码如下:

import re, pyperclip

# regex for password
regexEight = re.compile(r"\w{8,100}")   # regex for 8 char.
regexLower = re.compile(r'[a-z]')       # regex for lower.
regexUpper = re.compile(r"[A-Z]")       # regex for upper.
regexNum = re.compile(r"\d")            # regex for number.

# get text from paste
text = str(pyperclip.paste())

# see if text matches every regex.
mo = regexEight.search(text)
if mo != None:
    exit
else:
    print("Password to short.")

mo2 = regexLower.search(text)
if mo2 != None:
    exit
else:
    print("Password need to contain at least one lower case character.")

mo3 = regexUpper.search(text)
if mo3 != None:
    exit
else:
    print("Password need to contain at least on upper case character.")

mo4 = regexNum.search(text)
if mo4 != None:
    exit
else:
    print("Password need to contain at least one digit.")

# return this if every regex matches.
if mo or mo2 or mo3 or mo4 != None:
    print("You have a strong password.")

我是RE的初学者,所以我使用None来查看该对象是否匹配(如果匹配则返回特定密码,如果它没有&#t; t mo(1,2,3) =无)。但是,我觉得这种方式很不寻常,或者至少我不认为应该如何处理RE,所以这就是我在这里问的原因。

有没有办法让这段代码更简单?或者这种方式对程序来说还算可以吗?在我看来,如果没有所有的if和#n,那么代码会更好。有没有办法摆脱它们?

2 个答案:

答案 0 :(得分:1)

我认为一个不错的通用方法是创建一些结构来保存您要检查的正则表达式以及相应的错误消息。

import re

tests = [
    (re.compile(r"\w{8,100}"), "Too short."),
    (re.compile(r"[a-z]"), "Add lowercase letter."),
    (re.compile(r"[A-Z]"), "Add uppercase letter."),
    (re.compile(r"\d"), "Add number.")
]

check = True
for regex, message in tests:
    if regex.search("example_password") is None:
        print(message)
        check = False

if check:
    print("Strong password.")

答案 1 :(得分:0)

你使这种方式比它需要的更复杂:

def validate_password(password):
    if not password or len(password) < 8:
        print("Password too short!")
    elif password == password.lower() or password == password.upper():
        print("Password must contain at least one lowercase and one uppercase character!")
    elif not any(c.isdigit() for c in password):
        print("Password must contain at least one digit!")
    else:
        return True  # all is well
    return False  # didn't validate
相关问题