正则表达式 Python 模式 [重复]

Posted

技术标签:

【中文标题】正则表达式 Python 模式 [重复]【英文标题】:Regex Python pattern [duplicate] 【发布时间】:2016-11-16 14:30:35 【问题描述】:

我正在尝试编写一个程序,它使用正则表达式来确保它传递的密码字符串是强的。强密码被定义为至少有八个字符长、包含大写和小写字符并且至少有一个数字的密码。到目前为止,我有以下代码。我花了几个小时修改正则表达式,但是我不能让它通过。每次我进行更改时,似乎强密码都被标记为弱密码,或者弱密码为强密码。知道如何改进吗?

import re


pass2Regex = re.compile(r'''
    \d*
    [a-zA-Z]*
    \d*
    [a-zA-Z]*
    ''',re.VERBOSE)


text = raw_input("enter your password\n")
if len(text) >= 8:
    search = pass2Regex.findall(text)
    if text in search:
        print "%s is a strong password" % (text)
    else:
        print "%s is a weak password" % (text)
else:
    print "%s is a weak password" % (text)

例如,现在如果密码是“231242441”,即使没有字母,它也会被标记为强密码。此外,当我尝试使用 + 而不是 * 时,它只会接受以数字等开头的密码。

感谢您的帮助

【问题讨论】:

见这里:***.com/a/75149/3928184 另见Regex for Password Must be contain at least 8 characters, least 1 number and both lower and uppercase letters and special characters。去掉“特殊字符”条件,你就有答案了。 @WiktorStribiżew 的建议比我的更有用 该答案中的相关正则表达式:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]8,$ 最后一部分的另一种写法是[^\W_]8, 说实话,你的表达式甚至会验证一个空字符串:) 【参考方案1】:

您可以使用所有 python,因此不要将自己限制在单个正则表达式中。为密码必须满足的每个条件编写一个正则表达式。 “包含大写”?琐碎的。 “小写”?也是微不足道的。 “至少一位数”?没问题。 “至少 8 个字符长”?你甚至不需要正则表达式。

您可以级联测试,将一系列测试与and 组合在一起,或者将测试放在一个列表中并一次性应用它们,如下所示:

tests = [ "[A-Z]", "[a-z]", r"\d", ".8" ]
if all(re.search(pat, text) for pat in tests):
    print("It's a strong password")

为下一步节省您的时间。

【讨论】:

如果他可以一次拥有所有东西,他为什么要这样做? 因为任何单一的正则表达式“解决方案”,即使是你的,都远不如拆分它的可读性、可验证性或可扩展性(即可维护性)。 我同意你的观点,大多数正则表达式解决方案都没有以详细模式编写 - 但是,如果你添加 cmets(这是我通常做的),我认为它们通常比查找每个函数的参数更直接 - 毕竟这是一个品味问题,我猜 :) 详细模式很好,但您仍然有一个正则表达式,其中所有工作都在多个重叠的前瞻中完成,甚至不使用非贪婪通配符。谢谢,但我会通过的。而且 cmets 不是验证——它们可能是不正确的。 @Jan 我喜欢正则表达式。但是,能够编写/维护正则表达式的人比能够理解/更新/维护 Python 字符串方法的人少。如果有更简单、更清晰、更易于维护的方式,请选择它。【参考方案2】:

正如其他人所提到的,这是lookarounds 的典型用例(在这种情况下为lookaheads)。 前瞻 在不消耗字符的情况下前瞻(这是一个断言)。 细分为您的需求:

强密码被定义为至少包含八个字符的密码 long,包含大写和小写字符,并且有 at 至少一位数。

^                    # anchors the expression to the beginning
    (?=[^a-z]*[a-z]) # not lowercase, followed by lowercase
    (?=[^A-Z]*[A-Z]) # not UPPERCASE, followed by UPPERCASE
    (?=\D*\d)        # not a digit, followed by a digit
    .8,            # at least 8 characters long
$                    # anchor the expression to the end

a demo on regex101.com


因此,对于您的代码 sn-p 这将是:
import re
pass2Regex = re.compile(r"""
    ^                    # anchors the expression to the beginning
        (?=[^a-z]*[a-z]) # not lowercase, followed by lowercase
        (?=[^A-Z]*[A-Z]) # not UPPERCASE, followed by UPPERCASE
        (?=\D*\d)        # not a digit, followed by a digit
        .8,            # at least 8 characters long
    $                    # anchor the expression to the end
""", re.VERBOSE)

password = "WeaK1234"
password2 = "strong?"

if pass2Regex.search(password):
    print "Strong!"

if pass2Regex.search(password2):
    print "Strong!"

【讨论】:

我不太了解你们的 cmets 或主播的工作。你介意换句话解释一下吗?谢谢! OP 代码实际上已经检查了字符串的长度,你不需要在末尾添加8,+ 就够了:) @WiktorStribiżew:不知道,谢谢。 @brianhalperin: ^$ 确保分别匹配字符串的开头和结尾。

以上是关于正则表达式 Python 模式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

查找连续重复单词时的Python后视正则表达式“固定宽度模式”错误

在Python中使用正则表达式解析具有重复模式的字符串?

python基础——正则表达式

第11.9节 Python正则表达式的贪婪模式和非贪婪模式

Python-正则表达式

python re正则表达式基本使用介绍