Python正则表达式疑问:为何带*的正则能匹配而无*的不行?
为什么两个正则匹配结果不同?
嘿,这个问题本质是正则量词「匹配次数」的差异导致的,咱们结合你的字符串和正则一步步拆解:
首先看你的目标字符串:a = "6253625879615786",数一下长度刚好是16位。
第一个正则:^[456][0-9]{15}[^,_]
咱们拆分每一部分的作用:
^[456]:匹配字符串开头的第一个字符,要求是4、5、6中的一个(你的字符串开头是6,符合要求)[0-9]{15}:严格匹配15个数字,这部分加上前面的1个字符,刚好把整个16位的字符串全匹配完了[^,_]:要求必须匹配1个不是逗号或下划线的字符——但此时字符串已经到末尾了,没有多余的字符可以满足这个要求,所以整个正则匹配失败,re.findall()自然没有输出。
第二个正则:^[456][0-9]{15}[^,_]*
差异就在最后的*量词上:
[^,_]*表示「匹配0次或多次非逗号/下划线的字符」,它允许匹配0次——也就是说,当前面的^[456][0-9]{15}已经把整个字符串匹配完后,后面的[^,_]*可以“什么都不匹配”(匹配0次),整个正则的条件依然满足,所以能成功匹配到整个字符串,re.findall()就返回了匹配结果。
简单总结:[^,_]是必须匹配至少1个字符,而[^,_]*是可以匹配0个或多个字符,这就是导致两个正则结果不同的核心原因。
内容的提问来源于stack exchange,提问作者Aaron B
相关产品推荐
相关产品推荐

