CTF正则表达式挑战:匹配所有字符出现次数一致的字符串
CTF正则表达式挑战:匹配所有字符出现次数一致的字符串
嘿,这确实是个够硬核的正则挑战!先把需求和测试用例理清楚:我们需要一个正则表达式,能精准匹配所有不同字符出现次数完全相同的字符串——不管字符类型是什么、字符串长度多少(上限62位),而且得用Python的regex模块(支持递归、命名组这类高级特性)。先看看给定的测试样本:
预期匹配的字符串
- "arraigning"
- "nonordered"
- "abadbacdcacbdbdc"
- "mesosome"
- "ananna"
- "unendued"
- "tromometer"
- "caucasus"
- "intestines"
- "i"
- "deed"
- "horseshoer"
- "happenchance"
- "reappear"
- "deeded"
- "pullup"
- "testes"
- "mononymy"
- "scintillescent"
- "couscous"
预期不匹配的字符串
- "edified"
- "unreverberating"
- "underpass"
- "interinsert"
- "pilfered"
- "nippiness"
- "gregarinian"
- "deicide"
- "nonaristocratic"
- "rototiller"
- "ozonizing"
- "museums"
- "backbreaker"
- "interradiated"
- "antistalling"
- "naturalize"
- "equitriangular"
- "reparticipate"
- "ppd"
- "miasmas"
- "cabbage"
核心问题:能不能用Python regex实现?
直接说结论:哪怕用Python的高级regex模块,也几乎不可能写出这样的正则表达式,原因如下:
- 正则的本质是有限状态自动机(FSM),它只能跟踪有限数量的状态。而要验证“所有字符出现次数相同”,需要跟踪任意多个不同字符的出现次数——这意味着需要无限多的状态,完全超出了FSM的能力边界。
- 虽然Python的
regex支持递归、命名组和平衡匹配,但这些特性主要用来处理嵌套结构(比如括号匹配),没法动态跟踪任意字符的计数同步。你没法提前预知字符串里会有多少种不同字符,更没法让正则“记住”每个字符已经出现了多少次,再和其他字符的次数做对比。
最优替代方案
既然正则这条路走不通,最直接高效的方案是用Python代码实现字符计数验证,逻辑简单且准确率100%:
from collections import Counter def is_valid_char_count(s): # 统计每个字符的出现次数,取所有次数值 count_values = Counter(s).values() # 所有次数相同的话,去重后只剩一个值 return len(set(count_values)) == 1
用这个函数测试给定的样本:所有match_words都会返回True,not_match_words返回False,完全符合需求。
如果是CTF场景下非要用正则凑个近似?其实最多只能匹配一些特定情况(比如所有字符出现1次,或所有字符出现2次),但没法覆盖所有可能的情况——毕竟你没法提前知道每个字符串的字符次数k是多少。
内容来源于stack exchange
相关产品推荐
相关产品推荐

