【问题标题】:Return the string is invalid for four times consecutive repetition of a digit using Regex in Python在Python中使用Regex返回字符串连续四次重复一个数字无效
【发布时间】: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


【解决方案1】:

尝试以下方法之一:

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

或者如果第二组(不是开始)必须是 4567 试试...

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

【讨论】:

  • 您能否编辑您的问题并在原始文本下方放置一个有效数字列表,然后是应该被视为无效的可能值列表?放入“有效:”和纯文本列表,然后放入“无效:”和纯文本列表,这样就不会出现其他值
  • 希望我在编辑问题时清楚自己。如果需要对这个问题进行更多澄清,我可以再来。谢谢。
  • 仍然不确定。为什么5123-4567-8912-3456有效,5133-3367-8912-3456无效?您提到“...33-33...”,但这是不允许的吗?如果是这样,您必须解释此处允许的内容。前三,后三,三三,四?第三个位置的3?必须知道允许数量及其确切顺序。 :o(
  • 抱歉,重新阅读您的帖子。所以任何数字只能重复三遍?
  • 我提到的我们需要遵循的条件,我们现在可以留下一个特定的字符串。
【解决方案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])\1\1\1", s.replace("-", "")):
        print("Valid")
    else:
        print("Invalid")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 2016-09-19
    • 2021-09-30
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多