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

标签 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")

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

最佳答案

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

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

RegEx Demo

正则表达式说明:

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

Read more about look aheads and look behinds

代码:

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)

关于python - 正则表达式没有字符应该重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358885/

相关文章:

python - 异常评估顺序

python - pandas:与不同列中的键合并(使用 col1 或 col2 合并)

python - 显示找到的文件数和进度

regex - 什么正则表达式将匹配模式或为空?

python - 如何获取正则表达式来捕获 "x dollar(s) and x cents"?

python-3.x - 导入错误 : cannot import name 'AppLayout' from 'ipywidgets'

python - Pandas 过滤器未按预期工作

python - 如何从 numpy 数组创建数据框?

python - Pandas 有条件地返回另一列中相应位置的值

html - 如何使用正则表达式获取选定的选项文本?