为什么这个regex模式不能按预期工作?

2024-04-26 19:14:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个regex模式来捕捉任何16位的数字字符串(每个数字组由一个连字符分隔),而不需要任何数字重复超过3次,中间有或没有连字符。你知道吗

所以我写的模式是

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

但是示例“5133-3367-8912-3456”即使在3重复4次时也会匹配。(消极前瞻部分有什么问题?)你知道吗


Tags: 字符串re示例模式数字字符regexcompile
1条回答
网友
1楼 · 发布于 2024-04-26 19:14:23

Lookaheads只在它们所处的位置进行检查,因此在您的例子中是在字符串的开头。如果你想用一个向前看的方法基本上检查整个字符串,如果某个模式可以匹配或者不能匹配,你可以在前面加上.*,这样就可以更深入地检查字符串。你知道吗

在您的例子中,您可以将其更改为r'(?!.*(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'。你知道吗

也没有必要在它们所处的位置上逃逸负号,我会在^之后移动展望。我不知道python正则表达式优化得有多好,但是这样首先匹配字符串锚点的开头(只有1个有效位置),而不是在任何地方检查lookahead以使匹配在^失败。这将给r'^(?!.*(\d)-?\1-?\1-?\1)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'

相关问题 更多 >