如何在密码中的任意位置匹配特殊字符和数字?

时间:2019-05-07 01:51:01

标签: python regex special-characters

唯一匹配的特殊字符位置是密码的结尾。如果特殊字符位于开头或结尾以外的任何地方,它将无法匹配并拒绝密码。

import re

while True:
    password = input("Please enter a password containing at least 6 letters, \n "
                "one number, one capital letter, and at least one special character. ")

    pattern = r"[A-Z]+?[A-Za-z]{6,}?[0-9]+?[^a-zA-Z0-9]+?"

    if not re.search(pattern, password):
        print("Please try again")

    else:
        print("Your new password is: ", password)
        break

我想接受包含特殊字符和数字的密码,密码包含在其中的任何地方,而不仅仅是结尾处,例如

  • @#$Chuckles23
  • Chuck#$les23
  • 23Chuckles@#$

我尝试使用其他答案中建议的正则表达式代码,但到目前为止,它们都不适合我的情况。

2 个答案:

答案 0 :(得分:3)

尝试在密码正则表达式模式中使用先行提示

pattern = r'^(?=.*[0-9])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{6,}$'
if not re.search(pattern, password):
    print("Please try again")

以下是正则表达式模式的简要说明:

^                        from the start of the password
    (?=.*[0-9])          assert that at least one digit is present
    (?=.*[A-Z])          assert that at least one capital letter is present
    (?=.*[^a-zA-Z0-9])   assert one special character
    .{6,}                then match any 6 or more characters
$                        end of the password

答案 1 :(得分:0)

这可以通过先行完成。可以通过以下方式提前检查每个条件:

(?=.*[A-Z])(?=(?:.*[A-Za-z]){6,})(?=(?:.*[0-9]))(?=(?:.*[^a-zA-Z0-9])).*

除了re.match之外,您还可以使用re.fullmatchre.search作为验证者。

可以使用lookbehinds获得等效表达式:

.*(?<=.*[A-Z])(?<=(?:.*[A-Za-z]){6,})(?<=(?:.*[0-9]))(?<=(?:.*[^a-zA-Z0-9]))

您甚至可以混合搭配:

(?=.*[A-Z])(?=(?:.*[A-Za-z]){6,}).*(?<=(?:.*[0-9]))(?<=(?:.*[^a-zA-Z0-9]))

从功能上讲,这些方法都是等效的。差异主要是美学上的差异,尽管当然也可能存在一些实现细节,这些细节也会导致较小的时序差异。