【发布时间】:2020-03-25 18:58:37
【问题描述】:
我认为我离解决方案太近了。 (需要推动!)
import re
for _ in range(int(input())):
match = re.findall(r'^([456])((\d){3}(-)?(\d){4}(-)?(\d){4}(-)?(\d){4})(?!.*\1\2){3}$', input())
if match:
print("Valid")
else:
print("Invalid")
我将解释我对所写正则表达式的理解,并针对所提出的问题。
- 字符串必须以 4,5 或 6 开头 - Regex: r'^([456])
-
必须恰好包含 16 位数字,并且可以包含 4 个一组的数字,用一个连字符“-”隔开
正则表达式:((\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) 因为它发生在连字符之前和之后)在执行后的输出屏幕中,上面的字符串也显示它不应该有效。
如果我错过了正则表达式中提到的其他条件,请分享您的答案。
提前致谢!
【问题讨论】:
-
"不得使用任何分隔符,如 "_" " " 等。"这似乎不见了。
-
我不确定我是否理解,因为“字符串必须以 456 开头”与您列出的有效内容冲突。我想出了 ^(\d{4})[\-\s]?(456\d)([\-\s]?[0-9]{4}){2}$ 但这可能无济于事- 可能是因为我没有看到明确的“匹配所有这些 [列出 10 或 20 个字符串] 并且不匹配这些 [列出另一个接近但不同的字符串]”
-
@Eraklon,如果我添加分隔符部分仍然是连续重复的问题,将无法解决。
-
@Sheeban 不可否认,为此我尝试了这个
^([456])(?!(?:\1-?){3})(?:(\d)(?!(?:\2-?){3})){3}(((?:-)?(?:(\d)(?!(\3-?){3})){4})){3}$,它似乎有效但没有仔细检查它(regex101.com/r/0fgOWA/10) -
@Eraklon 感谢您的锻炼,但它失败了。
标签: python regex python-3.x regex-lookarounds regex-group