我需要一个正则表达式模式来捕获任何 16 位数字字符串(每四个数字组由连字符分隔),并且任何数字重复次数不超过 3 次,中间有或没有连字符。
所以我写的模式是
a=re.compile(r'(?!(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)')
但是,即使 3 重复 4 次,示例“5133-3367-8912-3456”也会匹配。 (负向前看部分有什么问题?)
最佳答案
Lookaheads 仅在它们所在的位置进行检查,因此在您的情况下是在字符串的开头。如果您希望前瞻基本上检查整个字符串,如果某个模式可以或不能匹配,您可以添加 .*
放在前面,使琴弦更深。
根据您的情况,您可以将其更改为 r'(?!.*(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'
.
也不需要在它们所在的位置转义减号,我会将前瞻移动到 ^
之后。 。我不知道 python 正则表达式的优化程度如何,但这样首先匹配字符串 anchor 的开头(只有 1 个有效位置),而不是在任何位置检查前瞻,只是为了在 ^
处匹配失败。 。这将给出 r'^(?!.*(\d)-?\1-?\1-?\1)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'
关于python - 为什么这个正则表达式模式不能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43304253/