问题可以用Python

问题可以用Python

问题描述:

我试图获得以下条件的正则表达式组合多个先行的正则表达式:问题可以用Python

验证用户ID与下列条件:

  1. 它必须含有至少2个大写英文字母字符。
  2. 它必须至少包含3个数字
  3. 它应该只包含字母数字字符
  4. 没有字符应该重复。
  5. 有效的UID中必须有10个字符。

正则表达式,其工作原理,当我把检查分开而不是合并:

^(?=[a-zA-Z0-9]{10}$).*?(?=[A-Z][^A-Z]*?[A-Z]).*?(?=\d\D*?\d\D*?\d).* 

可能有人请澄清这是为什么不工作?

把每个条件单独工作时:

一个。 re.findall(r'^(?=[a-zA-Z0-9]{10}$)', inp)

b。 re.findall(r'(?=[A-Z][^A-Z]*?[A-Z])', inp) ...

+0

什么是__AT934j3Cn8__的正确输出?那个应该没问题。然而,尝试re.compile(r'^(?= [a-zA-Z0-9] {10} $)|(?= [AZ] [^ AZ]?[AZ])|(?= \ d \ D'\ d \ D *?\ d)。*') – anki

+0

*没有字符应该重复。*在整个字符串中或只是彼此相邻? – dawg

+0

用正则表达式解决这个问题并不是一个好问题。当检查一个特定的字符时,你的程序应该“记住”太多的东西(“这个字符已经被使用了吗?我已经有另一个大写字母了吗?”等等)。正则表达式不太擅长检查以前的值。我会尝试另一种方法(例如,手动计算字符为字典) – brandizzi

你可以使用正则表达式

(?!.*(.).*\1)(?=.*[A-Z].*[A-Z])(?=.*\d.*\d.*\d)[a-zA-Z0-9]{10} 

看到regex101 demo

(?!(。)。 \ 1)确保了没有字符被重复
(?= [AZ]。 [AZ])确保至少2大写炭存在
(?= \ d。 \ d。* \ d)确保ATLEAST 3个位数是本
[A-ZA-Z0-9] {10}匹配10个字母数字字符

+0

感谢您了解我学到的东西的代码。但是,能否请你解释一下我的方法中存在的多个预测相结合的缺陷(正如我原来的问题)? – Matiz

这里是一个正则表达式如你描述:

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

Demo

+0

谢谢@dawg。我想我应该更具体到我的问题,我的问题不是解决问题,而是试图了解为什么我的预测的组合不起作用,而另一个单独的预测工作 – Matiz

+0

有一个链接(在“Demo '),将您带到一个交互式正则表达式网站。看一个工作正则表达式,然后调试你正在尝试理解的那个。编辑你的问题,如果你得到的答案不同,你正在寻找。 – dawg