这是我试图解决的黑客问题。 问题陈述是:
你和弗雷德里克是好朋友。昨天,弗雷德里克收到了ABCD银行的信用卡。他想验证他的信用卡号是否有效。你碰巧在正则表达式上很棒,所以他正在寻求你的帮助! ABCD银行的有效信用卡具有以下特征:
输入格式 第一行输入包含一个整数。 下一行包含信用卡号。 约束
输出格式 打印'有效'如果信用卡号有效。否则,请打印'无效'。不要打印报价。
我提出的解决方案是:
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种情况时,它会被执行并显示所需的输出。
修改 我提到了这个问题的链接,这只是在线练习问题,不适用于任何竞争。
答案 0 :(得分:0)
^(?!.*?(\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-33
等3
连续重复4次的条目。
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()
为你的一个例子运行,然后按照你的说法运行程序退出。这就是为什么它没有尝试最后一个例子。