以固定的总长度匹配两个连续的序列

时间:2018-10-09 15:34:14

标签: python regex

我想匹配所有以1到4(小写)字母开头和1到4个数字开头的字符串,并且该序列的总长度(字母+数字)应为5。字母和数字不得混合。但是,实际字符串要长得多,并且此5序列后没有任何明显的单词边界(例如,可以跟着[a-z0-9])。但是,正则表达式只应与前5个字符有关。

例如:

  • 正匹配项:a1111aa111abc12defabc12345,...
  • 否定匹配:a1a1aaa11aaa111aaaa x,...

所以我需要像^([a-z]{1,4})[0-9]{5 - length of \1}这样的东西。

This question似乎有点关联,但我不知道如何使第二组的长度取决于第一组。 This answer建议对所有可能的字符进行前瞻性操作,但不能防止混合。

我不想只对字符串的前五个字符执行匹配(然后检查实际匹配的长度),因为我想扩展此正则表达式以匹配字符串的其余部分和其他模式。

就示例而言,组的长度很小,但实际上却更长(因此,手动指定各种组合不是一种选择;自动生成包含所有组合的正则表达式使我担心性能)

特别是我正在使用Python 3.6,但我对考虑其他正则表达式风格的解决方案感到满意。

2 个答案:

答案 0 :(得分:2)

您可以使用以下方法进行作弊的作弊

See regex in use here

\b[a-z]{1,4}\d{1,4}(?<=\b[a-z\d]{5})
  • \b在单词边界处声明位置
  • [a-z]{1,4}匹配1至4次小写字母
  • \d{1,4}匹配1到4次之间的数字
  • (?<=\b[a-z\d]{5})后面的积极表情确保前面的正好是5个小写字母和数字的组合

答案 1 :(得分:1)

正则表达式无法计数,您需要使用以下替代形式:

\b([a-z][0-9]{4}|[a-z]{2}[0-9]{3}|[a-z]{3}[0-9]{2}|[a-z]{4}[0-9])\b

Regex Demo