正则表达式没有字符应该重复

Ani*_*ngh 8 python regex python-3.x

我刚刚开始使用 python 的正则表达式部分,我以为我理解了这个概念,但是当我开始编程时,我无法理解。给出的问题陈述是设计一个正则表达式

  1. 它必须包含至少 2 个大写英文字母字符
  2. 它必须包含至少 3 位数字 (0-9)
  3. 它应该只包含字母数字字符
  4. 字符不应重复
  5. 必须正好有 10 个字符

我写的代码是

import re
n=int(input())
patt=r'^(?=.*[A-Z]).{2,}(?=.*[0-9]).{3,}(?=.*[\w]?){10}$'
for x in range(n):
    match=re.findall(patt,str(input()))
    #print(match)
    if match:
        print("Valid")
    else:
        print("Invalid")
Run Code Online (Sandbox Code Playgroud)

我首先从第一部分开始,即应该包含“它必须至少包含 2 个大写英文字母字符”,(?=.*[A-Z]).{2,}因为它会搜索两个以上的字符,并将使用前瞻断言对于第二部分,我应用了相同的和对于第三部分,即它应该只包含字母数字字符,我应用了(?=.*[\w]?)这三个似乎可以工作,但是当第四个和第五个条件出现时,即不应该重复任何字符,并且我最后尝试使用的字符必须正好是 10{10}个,但没有用现在整个事情似乎都被打破了。任何人都可以指导我如何使用正则表达式以及什么是积极的前瞻。

anu*_*ava 13

您可以将此正则表达式与 3 个前瞻断言一起使用,以满足您的所有条件:

^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:\D*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

正则表达式说明:

  • ^: 开始
  • (?=(?:[a-z\d]*[A-Z]){2}): Lookahead 断言我们至少有 2 个大写字母
  • (?=(?:\D*\d){3}): Lookahead 断言我们至少有 3 位数字
  • (?:([a-zA-Z\d])(?!.*\1)){10}: 精确匹配 10 个字母数字字符。负前瞻是断言我们在任何地方都没有任何重复。
  • $: 结尾

阅读更多关于向前看和向后看的信息

代码:

reg = re.compile(r'^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:.*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$')
arr = ['A1b2c3d4eF', 'B1CDEF2354', 'aBcDdef122', 'B1CD102354', 'a1bcf2coqb', 'a1bcf2oo3b', '1234567890']

for i in arr:
      print i, reg.match(i)
Run Code Online (Sandbox Code Playgroud)