2024-04-26 19:14:23 发布
网友
我需要一个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次时也会匹配。(消极前瞻部分有什么问题?)你知道吗
Lookaheads只在它们所处的位置进行检查,因此在您的例子中是在字符串的开头。如果你想用一个向前看的方法基本上检查整个字符串,如果某个模式可以匹配或者不能匹配,你可以在前面加上.*,这样就可以更深入地检查字符串。你知道吗
.*
在您的例子中,您可以将其更改为r'(?!.*(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'。你知道吗
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}$)'
^
r'^(?!.*(\d)-?\1-?\1-?\1)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'
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}$)'
相关问题 更多 >
编程相关推荐