我想根据以下条件验证 UID:
这是正确的正则表达式:
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断言时,我什么时候需要将模式放入或不放入()中,例如(?= 模式) (?= (模式))
我刚刚发现这是一个有趣的小挑战,并构建了一个函数来检查您提供的条件。我认为不使用正则表达式而是使用正则表达式和集合语法进行分而治之可以更容易地完成。
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"))
结果:正确