正则表达式限制特殊字符,少数除外

regex to restrict special characters except few

我能够编写一个正则表达式来验证输入框的以下标准。

  1. 至少包含 14 个字符
  2. 包含至少 1 个大写字母 (A-Z)
  3. 包含至少 1 个简单字母 (a-z)
  4. 包含至少 1 个数字 (0-9)
  5. 包含至少 1 个特殊符号 (+=!@#$%^&*)

正则表达式 -> ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[+=!@#$%^&*])(?=\S+$).{14,}$

但是,此正则表达式允许其他未提及的特殊字符。我想限制除这些 +=!@#$%^&*

之外的所有特殊字符

有人可以帮我根据上述条件修改给定的正则表达式吗?

您可以使用字符集将允许的字符限制为特定集,而不是允许任何字符的 .

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[+=!@#$%^&*])(?=\S+$)[0-9A-Za-z+=!@#$%^&*]{14,}$

为什么不用集合来代替正则表达式:

import string
upperSet   = set(string.ascii_uppercase)
lowerSet   = set(string.ascii_lowercase)
numberSet  = set("0123456789")
specialSet = set("+=!@#$%^&*")
allSets    = [upperSet,lowerSet,numberSet,specialSet] 
validSet   = set().union(*allSets)

isValid = len(pw)>=14 and validSet.issuperset(pw) \
          and all(s.intersection(pw) for s in allSets)

您还可以使用 translate 方法将每组字符转换为四个代码,然后检查这些代码是否准确地出现在翻译后的字符串中:

validCheck = str.maketrans(string.ascii_letters + "0123456789" + "+=!@#$%^&*",
                           "1"*26+"2"*26+"3"*10+"4"*10)

isValid = len(pw)>=14 and set('1234') == set(pw.translate(validCheck))))