Python Regex代码不能超过5次迭代

时间:2018-04-10 19:46:36

标签: python regex python-3.x regex-negation regex-group

这是我试图解决的黑客问题。 问题陈述是:

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

  1. 必须以a开头,或者。
  2. 必须包含确切的数字。
  3. 它必须只包含数字( - )。
  4. 它可能有一组数字,用一个连字符分隔" - "。
  5. 不得使用任何其他分隔符,例如' ' ,' _'等
  6. 不得有或多连续重复的数字。
  7. 输入格式 第一行输入包含一个整数。 下一行包含信用卡号。 约束

    输出格式 打印'有效'如果信用卡号有效。否则,请打印'无效'。不要打印报价。

    我提出的解决方案是:

     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种情况时,它会被执行并显示所需的输出。

    修改 我提到了这个问题的链接,这只是在线练习问题,不适用于任何竞争。

    Hackerrank-Validating Credit Card Numbers

2 个答案:

答案 0 :(得分:0)

See regex in use here

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

上述代码中的否定前瞻可选地与\D匹配,因此否定前瞻将过滤掉33-333连续重复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?\1){3})[4-6]\d{3}(?:-?\d{4}){3}$")

for s in a:
    x = r.search(s)
    if x:
        print(s)

结果

匹配/输出:

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

答案 1 :(得分:0)

这部分

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

为你的一个例子运行,然后按照你的说法运行程序退出。这就是为什么它没有尝试最后一个例子。