Python正则表达式如何设置选择条件及过滤指定长度匹配结果
解决方案
方法一:过滤统计结果
现有代码已经能拿到所有匹配项,只需在输出前筛选出长度大于8的条目即可。可以通过列表推导式对Counter的结果进行过滤,保留符合长度要求的项:
import re from collections import Counter pattern = r"0+1+0+1+0+1+" test_str = '0101010110110110110110110101010111011101110111101111010101111010111010101111011010101011011011011011011011' cnt = Counter(re.findall(pattern, test_str)) # 过滤长度>8的条目,保持原降序排序 filtered_result = [(k, v) for k, v in cnt.most_common() if len(k) > 8] print(filtered_result)
运行结果:
[('011011011', 2), ('0111011101111', 1), ('010111101', 1), ('0111101101', 1)]
方法二:在正则中直接限制长度
如果想从匹配源头就排除短字符串,可以用正向预查((?=.{9,}))添加长度约束。这个预查会检查当前位置开始的字符串至少有9个字符(即长度>8),但不会消耗字符,完全不影响原模式的匹配逻辑:
import re from collections import Counter # 新增正向预查,限制匹配字符串长度≥9 pattern = r"(?=.{9,})0+1+0+1+0+1+" test_str = '0101010110110110110110110101010111011101110111101111010101111010111010101111011010101011011011011011011011' cnt = Counter(re.findall(pattern, test_str)) print(cnt.most_common())
运行结果与方法一一致,直接跳过了长度≤8的匹配项。
正则字符数量条件说明
正则中控制字符/组出现次数的常用语法:
{n}:精确匹配n次{n,}:至少匹配n次{n,m}:匹配n到m次(包含两端)- 简写规则:
*等价于{0,},+等价于{1,},?等价于{0,1}
本次用到的(?=.{9,})是正向预查,属于正则断言的一种——它仅做条件检查,不会将检查的字符纳入最终匹配结果,非常适合在不修改原有匹配规则的前提下,额外添加长度这类全局约束。
内容的提问来源于stack exchange,提问作者RAnsari
相关产品推荐
相关产品推荐

