问题可以用Python
问题描述:
我试图获得以下条件的正则表达式组合多个先行的正则表达式:问题可以用Python
验证用户ID与下列条件:
- 它必须含有至少2个大写英文字母字符。
- 它必须至少包含3个数字
- 它应该只包含字母数字字符
- 没有字符应该重复。
- 有效的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)
...
答
你可以使用正则表达式
(?!.*(.).*\1)(?=.*[A-Z].*[A-Z])(?=.*\d.*\d.*\d)[a-zA-Z0-9]{10}
(?!(。)。 \ 1)确保了没有字符被重复
(?= [AZ]。 [AZ])确保至少2大写炭存在
(?= \ d。 \ d。* \ d)确保ATLEAST 3个位数是本
[A-ZA-Z0-9] {10}匹配10个字母数字字符
+0
感谢您了解我学到的东西的代码。但是,能否请你解释一下我的方法中存在的多个预测相结合的缺陷(正如我原来的问题)? – Matiz
什么是__AT934j3Cn8__的正确输出?那个应该没问题。然而,尝试re.compile(r'^(?= [a-zA-Z0-9] {10} $)|(?= [AZ] [^ AZ]?[AZ])|(?= \ d \ D'\ d \ D *?\ d)。*') – anki
*没有字符应该重复。*在整个字符串中或只是彼此相邻? – dawg
用正则表达式解决这个问题并不是一个好问题。当检查一个特定的字符时,你的程序应该“记住”太多的东西(“这个字符已经被使用了吗?我已经有另一个大写字母了吗?”等等)。正则表达式不太擅长检查以前的值。我会尝试另一种方法(例如,手动计算字符为字典) – brandizzi