我想匹配所有以1到4(小写)字母开头和1到4个数字开头的字符串,并且该序列的总长度(字母+数字)应为5。字母和数字不得混合。但是,实际字符串要长得多,并且此5序列后没有任何明显的单词边界(例如,可以跟着[a-z0-9]
)。但是,正则表达式只应与前5个字符有关。
例如:
a1111
,aa111
,abc12def
,abc12345
,... a1a1a
,aa11a
,aa11
,1aaaa x
,... 所以我需要像^([a-z]{1,4})[0-9]{5 - length of \1}
这样的东西。
This question似乎有点关联,但我不知道如何使第二组的长度取决于第一组。 This answer建议对所有可能的字符进行前瞻性操作,但不能防止混合。
我不想只对字符串的前五个字符执行匹配(然后检查实际匹配的长度),因为我想扩展此正则表达式以匹配字符串的其余部分和其他模式。
就示例而言,组的长度很小,但实际上却更长(因此,手动指定各种组合不是一种选择;自动生成包含所有组合的正则表达式使我担心性能)
特别是我正在使用Python 3.6,但我对考虑其他正则表达式风格的解决方案感到满意。
答案 0 :(得分:2)
您可以使用以下方法进行作弊的作弊。
\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