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

Why doesn't this regex pattern work as intended?

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

所以我写的模式是

a=re.compile(r'(?!(\d)\-?\-?\-?)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)')

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

先行仅在它们所在的位置进行检查,因此在您的情况下是在字符串的开头。如果你想先行基本上检查整个字符串,如果某个模式可以匹配或不能匹配,你可以在前面添加 .* 以更深入地了解字符串。

对于您的情况,您可以将其更改为 r'(?!.*(\d)\-?\-?\-?)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'

也没有必要在它们所在的位置转义减号,我会在 ^ 之后立即移动前瞻。我不知道 python 正则表达式的优化程度如何,但这样首先匹配字符串锚点的开头(只有 1 个有效位置),而不是在任何地方检查前瞻只是为了在 [= 处匹配失败12=]。这会给 r'^(?!.*(\d)-?-?-?)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'