关于 python:Regex – 如何从更宽的数字模式中排除 4 位数字

Regex - how to exclude 4 digit number from wider numeric pattern

真的尝试浏览和搜索这个特定问题是否以前发布过,所以我希望我在这里没有问一个明显的问题。

我的问题:我有一个正则表达式,用管道分隔的模式匹配几乎没有不同的可能标准。我对所有这些都很好,除了一个,我基本上想要:

  • 查找任何介于 4 到 6 位数字之间的表达式(无论字符串中的位置如何)
  • 从这个模式中排除与本世纪年份相关的表达式(所以从 20 开始,后跟两位数)

例如,我想匹配:4149、20259、202046,但想排除 2019,因为它指的是一年,而不是我要搜索的代码。

目前,我尝试应用这个(仅表达式的最后一部分): |\\\\d{4,6}?!20\\\\d{2}) ,但它无法正常工作。我知道管道前面的表达式很好,并且能够注意到 \\\\d{4,6} 在这种情况下添加"排除"后停止工作,所以我假设我没有使用?!适当地。我可以请你就这方面的建议吗?

编辑:解决了!非常感谢您的即时答复(我真的很惊讶几乎没有替代解决方案的速度如此之快)。抱歉,我只能选择一个,所有其他的都可以根据我的需要进行调整和可行,我只是发现这个最吸引人并且适合我的需要。


如果我不确定单词边界是否是您指示边界的最佳选择(也许 \\D 更好?),您可以尝试:

1
\\b(?!20\\d\\d\\b)\\d{4,6}\\b

查看在线演示

  • \\b - 字边界。
  • (?!20\\d\\d\\b) - 负前瞻:没有文字 20 后跟两位数字和一个单词边界。
  • \\d{4,6} - 四到六位数。
  • \\b - 字边界。

Regular


您可以使用以下正则表达式。

1
r'\\b(?:20\\d{3,4}|2[1-9]\\d{2,4}|[1,3-9]\\d{3,5})\\b'

演示


这应该可以工作:

1
[013-9][1-9]\\d{2}|\\d{5,6}

匹配所有 4 位序列,除了以 20 开头的序列,以及所有 5 或 6 位序列