Python字典中如何校验各键对应值恰好包含1个S和1个F
问题原因分析
你原有代码存在以下问题:
- 正则逻辑不符合需求:
r"[F]{1}"只能判断是否存在至少1个F,无法校验是否恰好只有1个r"[S].{1}"匹配规则是S后面跟随任意1个字符,和判断S的数量完全无关
- 只做了存在性校验,没有实现“恰好1个”的数量校验逻辑
最优解决方案(无需正则,性能更高易读)
直接用列表内置的count()方法统计字符出现次数即可:
d = {128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']} for key, val in d.items(): if val.count('F') != 1 or val.count('S') != 1: print(f"There is no start or end stop for the line {key}.")
运行后会正确输出There is no start or end stop for the line 128.,完全符合预期。
正则实现版本(仅作参考,更推荐上方方案)
如果一定要用正则实现,需要调整为匹配字符恰好出现1次的规则:
import re d = {128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']} for key, val in d.items(): s = "".join(val) # ^[^F]*F[^F]*$ 表示整个字符串中F恰好出现1次 if not re.search(r"^[^F]*F[^F]*$", s) or not re.search(r"^[^S]*S[^S]*$", s): print(f"There is no start or end stop for the line {key}.")
内容的提问来源于stack exchange,提问作者saad chraibi
相关产品推荐
相关产品推荐

