python - 为什么这个正则表达式模式不能按预期工作?

标签 python regex python-3.x credit-card

我需要一个正则表达式模式来捕获任何 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/

相关文章:

iOS - 不能是连续或重复数字的 4 位整数的正则表达式?

json - 如何修复 `` `ValueError : Trailing data ``` during `` `pandas. read_json(... )`` `?

python - 如何从键/初始计数对列表中初始化计数器?

java - php相当于jython?

python - 如何在 Ansible 2 中向 PlaybookExecutor 添加回调插件

python - Turtle 中是否有一个原生函数可以调整图像大小以适应窗口?

regex - 提高 PowerShell 过滤语句的性能

python - 生成额外输出的正则表达式

python - Django 自定义小部件在 1 以上的选择上失败(输入整数)

python - 计算包含 None 类型的列表的均值和最小值