Python 正则表达式代码不能工作超过 5 次迭代

Python Regex Code not working for more than 5 iterations

这是一个我试图解决的 hackerrank 问题。 问题陈述是:

你和弗雷德里克是好朋友。昨天,弗雷德里克收到了 ABCD 银行的信用卡。他想验证他的信用卡号码是否有效。你碰巧擅长正则表达式,所以他正在寻求你的帮助! ABCD 银行的有效信用卡具有以下特征:

  1. 必须以 , 或 开头。
  2. 它必须完全包含数字。
  3. 只能由数字(-)组成。
  4. 它可以有一组数字,用一个连字符“-”分隔。
  5. 它不能使用任何其他分隔符,如“”、“_”等。
  6. 它不能有或多个连续的重复数字。

输入格式 输入的第一行包含一个整数。 下一行包含信用卡号。 约束

输出格式 如果信用卡号有效,则打印 'Valid'。否则,打印 'Invalid'。不要打印引号。

我的方案是:

 import re

for _ in range(int(input())): cc_inp=输入()

reg=re.findall(r'(^[456]{1}\d{3})(?! _)(-?)(\d{4})(?! _)(-?)(\d{4})(?! _)(-?)(\d{4})$',cc_inp)
if reg:
    reg1=re.sub(r'\D', "",cc_inp)

    for i in range(13):
        if(reg1[i]==reg1[i+1]):
            if(reg1[i+1]==reg1[i+2]):
                if(reg1[i+2]==reg1[i+3]):
                    print("Invalid")
                    exit()                   
        else:
            res=True
    if(res==True):
        print("Valid")

else:
    print("Invalid")

对于测试用例:

6

4123456789123456

5123-4567-8912-3456

61234-567-8912-3456

4123356789123456

5133-3367-8912-3456

5123 - 3567 - 8912 - 3456

它只为前 5 个测试用例提供输出: 有效

有效

无效

有效

无效

第 6 个案例没有被执行,当我尝试单独执行第 6 个案例时,它被执行并显示所需的输出。

编辑: link 这道题我提一下,这只是在线练习题,不适合任何比赛。

Hackerrank-Validating Credit Card Numbers

See regex in use here

^(?!.*?(\d)(?:\D?){3})[4-6]\d{3}(?:-?\d{4}){3}$
  • ^ 在行首声明位置
  • (?!.*?(\d)(?:\D?){3}) 否定前瞻确保以下内容不匹配
    • .*? 匹配任何字符任意次数,但尽可能少
    • (\d) 将单个数字捕获到捕获组 1
    • (?:\D?){3} 正好匹配以下3次
      • \D? 可选择匹配一个 non-digit 字符
      • </code> 匹配与第一个捕获组最近匹配的相同文本</li> </ul></li> </ul></li> <li><code>[4-6] 匹配 4 到 6 范围内的任何数字
      • \d{3}匹配任意3位数字
      • (?:-?\d{4}){3} 正好匹配以下3次
        • -? 可选匹配 -
        • \d{4}匹配任意4位数字
      • $ 断言行尾的位置

      上面代码中的否定前瞻可以选择匹配 \D,这样否定前瞻将过滤掉像 33-33 这样的条目,其中 3 连续重复了 4 次。


      代码

      See code in use here

      import re
      
      a = [
          "4253625879615786","4424424424442444","5122-2368-7954-3214","4123456789123456","5123-4567-8912-3456","4123356789123456", #valid
          "6","42536258796157867","4424444424442444","5122-2368-7954 - 3214","44244x4424442444","0525362587961578","61234-567-8912-3456","5133-3367-8912-3456","5123 - 3567 - 8912 - 3456","5123 - 4567 - 8912 - 3456" #invalid
      ]
      r = re.compile(r"^(?!.*?(\d)(?:\D?){3})[4-6]\d{3}(?:-?\d{4}){3}$")
      
      for s in a:
          x = r.search(s)
          if x:
              print(s)
      

      结果

      Matches/Output:

      4253625879615786
      4424424424442444
      5122-2368-7954-3214
      4123456789123456
      5123-4567-8912-3456
      4123356789123456
      

      不匹配:

      6                          # Not 16 digits long
      42536258796157867          # Is 17 digits long
      4424444424442444           # Contains 44444 (4+ repetition)
      5122-2368-7954 - 3214      # Contains spaces around last hyphen
      44244x4424442444           # Contains non-digit character x
      0525362587961578           # Does not start with 4-6
      61234-567-8912-3456        # Length of first and second parts is not 4
      5133-3367-8912-3456        # Contains 33-33 (4+ repetition)
      5123 - 3567 - 8912 - 3456  # Contains spaces around hyphens
      5123 - 4567 - 8912 - 3456  # Contains spaces around hyphens
      

这部分

       if(reg1[i+2]==reg1[i+3]):
            print("Invalid")
            exit()                   

获取 运行 对于您的示例之一,然后程序退出,如您所说。这就是它不尝试最后一个示例的原因。