Python 正则表达式代码不能工作超过 5 次迭代
Python Regex Code not working for more than 5 iterations
这是一个我试图解决的 hackerrank 问题。
问题陈述是:
你和弗雷德里克是好朋友。昨天,弗雷德里克收到了 ABCD 银行的信用卡。他想验证他的信用卡号码是否有效。你碰巧擅长正则表达式,所以他正在寻求你的帮助!
ABCD 银行的有效信用卡具有以下特征:
- 必须以 , 或 开头。
- 它必须完全包含数字。
- 只能由数字(-)组成。
- 它可以有一组数字,用一个连字符“-”分隔。
- 它不能使用任何其他分隔符,如“”、“_”等。
- 它不能有或多个连续的重复数字。
输入格式
输入的第一行包含一个整数。
下一行包含信用卡号。
约束
输出格式
如果信用卡号有效,则打印 '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 这道题我提一下,这只是在线练习题,不适合任何比赛。
^(?!.*?(\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 次。
代码
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()
获取 运行 对于您的示例之一,然后程序退出,如您所说。这就是它不尝试最后一个示例的原因。
这是一个我试图解决的 hackerrank 问题。 问题陈述是:
你和弗雷德里克是好朋友。昨天,弗雷德里克收到了 ABCD 银行的信用卡。他想验证他的信用卡号码是否有效。你碰巧擅长正则表达式,所以他正在寻求你的帮助! ABCD 银行的有效信用卡具有以下特征:
- 必须以 , 或 开头。
- 它必须完全包含数字。
- 只能由数字(-)组成。
- 它可以有一组数字,用一个连字符“-”分隔。
- 它不能使用任何其他分隔符,如“”、“_”等。
- 它不能有或多个连续的重复数字。
输入格式 输入的第一行包含一个整数。 下一行包含信用卡号。 约束
输出格式 如果信用卡号有效,则打印 '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 这道题我提一下,这只是在线练习题,不适合任何比赛。
^(?!.*?(\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 次。
代码
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()
获取 运行 对于您的示例之一,然后程序退出,如您所说。这就是它不尝试最后一个示例的原因。