Python3 re正则如何忽略横杠匹配连续重复数字(用于信用卡校验)
解决方案
直接调整validNoConsecutive的正则规则即可实现忽略横杠校验连续重复数字,修改后的完整代码如下:
import re def isValid(number): validStart = re.compile(r'^[456]') # 卡号以4、5、6开头 validLength = re.compile(r'^[0-9]{16}$|^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}$') # 长度符合16位纯数字或4-4-4-4带横杠格式 validOnlyDigits = re.compile(r'^[0-9-]*$') # 仅包含数字和横杠 # 修改后的连续重复校验规则:禁止4个及以上相同数字(中间可穿插横杠) validNoConsecutive = re.compile(r'(?!(\d)(-?\1){3})') validators = [validStart, validLength, validOnlyDigits, validNoConsecutive] return all([val.search(number) for val in validators]) # 测试示例 arr = ["1234-5678-9101-1213", "1233-3345-6789-1011", "4444567890123456", "5123-4567-8901-2345"] list(map(print, ['Valid' if isValid(num) else 'Invalid' for num in arr]))
规则说明
新的负向前瞻规则r'(?!(\d)(-?\1){3})'的逻辑为:
- 首先捕获1位数字到分组1
- 后续重复匹配3次「0或1个横杠 + 与分组1完全相同的数字」
- 只要字符串中存在符合该规则的片段,就说明存在4个连续的相同数字(中间可穿插横杠),负向前瞻生效,校验不通过。
该规则兼容纯数字和带横杠两种卡号格式,无需提前替换横杠即可完成校验,完全符合需求。
内容的提问来源于stack exchange,提问作者Matanya
相关产品推荐
相关产品推荐

