为什么这个正则表达式模式不能按预期工作?

时间:2017-04-09 07:42:09

标签: python regex python-3.x credit-card

我需要一个正则表达式模式来捕获任何16位数字的数字(每个四个数字组用连字符分隔),没有任何数字重复超过3次,中间有或没有连字符。

所以我写的模式是

R

但是即使3重复4次,示例“5133-3367-8912-3456”也会匹配。 (负前瞻部分有什么问题?)

1 个答案:

答案 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}$)'