Python 为什么我的正则表达式不用于字符验证

Python 为什么我的正则表达式不用于字符验证,python,regex,Python,Regex,这里我的(?=.[a-z]{2})正在显式地检查2个小字符。但是我不能接受 import re char = 'Massas23#' if re.search(r"^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z]{2})(?=.*[@#$])[\w\d@#$]{6,12}$", char): print ("match") else: print ("Not Match") 我的输出是匹配,预期是不匹配可能 ^(?!.*[a-z]{3})(?=.*[\d])(?

这里我的
(?=.[a-z]{2})
正在显式地检查2个小字符。但是我不能接受

import re
char = 'Massas23#'
if re.search(r"^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z]{2})(?=.*[@#$])[\w\d@#$]{6,12}$", char):
    print ("match")
else:
    print ("Not Match")
我的输出是
匹配
,预期是
不匹配

可能

^(?!.*[a-z]{3})(?=.*[\d])(?=.*[A-Z])(?=.*[a-z]{2})(?=.*[@#$])[\w\d@#$]{6,12}$
那就行了

(?!.*[a-z]{3})
表示不允许超过三个连续的小写字母

试验
如果您希望简化/修改/探索表达式,将在的右上面板中进行解释。如果您愿意,还可以在中查看它与一些示例输入的匹配情况


正则表达式电路 可视化正则表达式:


我想我们不是在试图匹配
23
,如果你想匹配的话

^(?!.*[a-z]{3})(?=.*[\d])(?=.*[A-Z])(?=.*[a-z]{1,2})(?=.*[@#$])[\w\d@#$]{6,12}$
我会那样做的


您可以从character类中省略小写字符,然后精确匹配2个小写字符a-z

例如,可以使用求反字符类来匹配非数字

^(?=.{6,12}$)(?=[^\d\s]*\d)(?=[^A-Z\s]*[A-Z])(?=[^@#$\s]*[@#$])[A-Z0-9_@#$]*[a-z][A-Z0-9_@#$]*[a-z][A-Z0-9_@#$]*$
  • ^
    字符串的开头
  • (?=.{6,12}$)
    断言6-12个字符
  • (?=[^\d\s]*\d)
    断言一个数字
  • (?=[^A-Z\s]*[A-Z])
    断言大写字符
  • (?=[^@#$\s]*[@#$])
    断言一个特殊字符
  • [A-Z0-9#$]*[A-z][A-Z0-9#$]*[A-z][A-Z0-9#$]*[A-z][A-Z0-9#$]*
    匹配2个小写字母A-z
  • $
    字符串结尾

注意

  • [\d]
    不必在方括号内
  • [\w\d@#$]
    \w
    还与
    \d
    匹配,因此可以从字符类中省略

不超过2个小案例,显式2个小案例为什么你在开头放
(?!.[a-z]{3})
它不匹配
MAsSa23
,我认为它应该
显式2个小案例
^(?=.{6,12}$)(?=[^\d\s]*\d)(?=[^A-Z\s]*[A-Z])(?=[^@#$\s]*[@#$])[A-Z0-9_@#$]*[a-z][A-Z0-9_@#$]*[a-z][A-Z0-9_@#$]*$