【问题标题】:Python Regex Code not working for more than 5 iterationsPython 正则表达式代码不能工作超过 5 次迭代
【发布时间】:2018-04-10 19:46:35
【问题描述】:

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

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

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

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

输出格式 如果信用卡号有效,请打印“有效”。否则,打印“无效”。不要打印引号。

我的解决方案是:

 import re

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

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

【问题讨论】:

  • 这是一场跑步比赛吗?
  • 您的规则不清楚,我认为您缺少信息。
  • 请展示您如何将测试用例提供给您的代码。
  • @WillemVanOnsem 不,这不是比赛,只是练习题。
  • @ctwheels 我已经提到了问题的链接,希望它能提供所需的信息。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这部分

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

    为您的一个示例运行,然后程序退出,正如您所说的那样。这就是它不尝试最后一个示例的原因。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2016-09-29
      相关资源
      最近更新 更多