使用正则表达式在Python中验证UID

问题描述 投票:0回答:1

我想根据以下条件验证 UID:

  1. 至少两个大写字母
  2. 至少三位数
  3. 只能包含字母数字字符(a-z、A-Z、0-9)
  4. 任何字符不得重复
  5. 必须正好 10 个字符

这是正确的正则表达式:

re.match(r'^(?=(?:.*[A-Z]){2,})(?=(?:.*\d){3,})(?!.*(.).*\1)[a-zA-Z0-9]{10}$', input())

以下两个是我的解决方案:

#A  re.match(r'^(?=(.*[A-Z]){2,})(?=(.*\d){3,})(?!.*(.).*\1)[a-zA-Z0-9]{10}$',input())
#B  re.match(r'^(?=.*[A-Z]{2,})(?=.*\d{3,})(?!.*(.).*\1)[a-zA-Z0-9]{10}$',input())

A 无法匹配任何内容 B 只能匹配几种情况,如:'AhBUw9r675','41726EHJIr','X6543g08QS', 无法匹配以下情况:'yD09Ee83fJ','96R5ZDJg72','r57tH100Ej','h7AFN4y5dt'....等

我的问题是为什么我的两个解决方案都是错误的,更具体地说

对于A:捕获组和非捕获组有什么区别,除了一个可以返回匹配并被引用,而另一个只搜索匹配但不返回任何内容

对于B:当使用lookahead或lookbehind断言时,我什么时候需要将模式放入或不放入()中,例如(?= 模式) (?= (模式))

python regex regex-lookarounds uid regex-look-ahead
1个回答
0
投票

我刚刚发现这是一个有趣的小挑战,并构建了一个函数来检查您提供的条件。我认为不使用正则表达式而是使用正则表达式和集合语法进行分而治之可以更容易地完成。

import re
def checkuid (uid: str):
    isuidcorrect = True
    #at least two uppercase letters
    if not len(re.findall('[A-Z]', uid)) >= 2:
       isuidcorrect = False
    #at least three digits
    if not len(re.findall('[0-9]', uid)) >= 3:
       isuidcorrect = False
    #must only contain alphanumeric characters (a-z,A-Z,0-9)
    #must be exactly 10 characters
    if not len(re.findall('[a-z,A-Z,0-9]', uid)) == 10:
       isuidcorrect = False
    #no character should repeat
    if not len(set(uid)) == len(uid):
       isuidcorrect = False

    return isuidcorrect


print(checkuid("yD09Ee83fJ"))

结果:正确

© www.soinside.com 2019 - 2024. All rights reserved.