返回在Python中使用Regex连续重复四次数字的字符串无效



我觉得我离解决方案太近了。(需要推动!(

import re
for _ in range(int(input())):
match = re.findall(r'^([456])((d){3}(-)?(d){4}(-)?(d){4}(-)?(d){4})(?!.*12){3}$', input())
if match:
print("Valid")
else:
print("Invalid")

我将解释我对我写的正则表达式的理解,与所问的问题相对应。

  • 字符串必须以4,5或6开头-Regex:r'^([456](
  • 必须包含16位数字,并且可以以4位为一组,由一个连字符"-"分隔

    Regex:((\d({3}(-(?(\d({4}(-(?(\d({4}(-(?(\d({4}(

  • 必须仅由数字0-9 组成

  • 不得使用任何分隔符,如"_"" "
  • 它不能有4个或更多连续重复的数字-Regex:(?!.*\1\2({3}$

    • 有效:4123456789123456

    • 有效:5123-4567-8912-3456

    • 无效:61234-567-8912-3456(因为它不构成一组4{61234}(

    • 有效:4123356789123456

    • 无效:5133-3367-8912-3456

    (问题是它接受了四个(3333(因为它出现在连字符之前和之后(在执行后的输出屏幕中,上面的字符串也显示出它不应该显示的有效字符串。

如果我错过了正则表达式中提到的其他条件,请分享您的答案。

提前感谢!

尝试其中一种:

^(d{4})([-]?[0-9]{4}){3}$

或者,如果第二组(不是起点(必须是4567,请尝试。。。

^(d{4})[-]?(4567)([-s]?[0-9]{4}){2}$

最后,我给出了答案。谢谢大家的帮助。

import re
for _ in range(int(input())):
s = input()
if re.match(r"^[456]([d]{15}|[d]{3}(-[d]{4}){3})$", s) and not re.search(r"([d])111", s.replace("-", "")):
print("Valid")
else:
print("Invalid")

最新更新