【问题标题】:Regex No Character Should Repeat正则表达式没有字符应该重复
【发布时间】:2018-12-23 19:52:01
【问题描述】:

我刚刚开始使用 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},但它不起作用,现在整个事情似乎都坏了。谁能指导我如何使用正则表达式以及什么是积极的前瞻性。

【问题讨论】:

  • No character should repeat 表示字符串中任何位置的任何字符都应匹配,例如“B1CD102354”根据上述条件是无效字符串,因为这里 1 重复了两次。
  • 你有没有从 HackerRank Validating UID 问题中提出问题?

标签: python regex python-3.x


【解决方案1】:

您可以将此正则表达式与 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)

【讨论】:

    【解决方案2】:

    字符不应重复条件:regex to match a word with unique (non-repeating) characters

    匹配确切的字符数条件:Regular expression to match exact number of characters?

    必须包含条件:Regex must contain specific letters in any order

    应该只包含条件:从这个问题看来你已经自己弄清楚了。

    剩下的工作是将它们结合起来,如果这是给你的练习的一部分,你应该自己做。

    【讨论】:

      【解决方案3】:
      import re
      n = int(input())
      patt = r'^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:\D*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$'
      for x in range(n):
          match=re.match(patt,str(input()))
          if match:
              print("Valid")
          else:
              print("Invalid")
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      【解决方案4】:

      这是我对这个问题的解决方案:

      import re
      
      for _ in range(int(input())):
          UID = input()
          try:
              assert re.fullmatch(r'[A-Za-z0-9]{10}',UID)
              assert re.fullmatch(r'([a-z0-9]*[A-Z]+[a-z0-9]*){2,}',UID)
              assert re.fullmatch(r'([a-zA-Z]*[0-9]+[a-zA-Z]*){3,}',UID)
              assert not(re.search(r'(.).*?\1',UID))
                  
          except AssertionError:
              print('Invalid')
          else:
              print('Valid')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多