我需要一个正则表达式模式来捕获任何16位数字的数字(每个四个数字组用连字符分隔),没有任何数字重复超过3次,中间有或没有连字符。
所以我写的模式是
R
但是即使3重复4次,示例“5133-3367-8912-3456”也会匹配。 (负前瞻部分有什么问题?)
答案 0 :(得分:2)
Lookaheads只在它们所处的位置进行检查,所以在你的情况下,在字符串的开头。如果您希望前瞻基本上检查整个字符串,如果某个模式可以匹配或不匹配,您可以在前面添加.*
以深入了解字符串。
在您的情况下,您可以将其更改为r'(?!.*(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'
。
也没有必要在他们所处的位置逃避减号,我会在^
之后移动前瞻。我不知道python正则表达式的优化程度如何,但是这样首先匹配字符串锚点的开始(只有1个有效位置),而不是在任何地方检查前瞻,只是为了使^
的匹配失败。这将给出r'^(?!.*(\d)-?\1-?\1-?\1)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'