Python实现字符串连续三个相邻相同字母的检测及pythonic优化方案
连续三相同字母检测的Python优化实现
原硬编码方案的固有缺陷
- 维护效率低:需要手动枚举全部26个固定三字母组合,一旦检测规则调整(比如要匹配连续4个相同字母),需要重写整个硬编码列表
- 运行效率差:每次检测需要对26个固定串逐一执行子串匹配,总计算量是26次字符串扫描的叠加,远高于单次线性扫描的成本
两种Pythonic 实现方案
1. 正则匹配实现(长字符串场景首选)
核心逻辑是通过带反向引用的正则模式,一次扫描就完成匹配,完全不需要预先生成所有字母组合串。
- 匹配规则说明:
r'([a-zA-Z])\1\1'的含义是,先捕获任意大小写字母作为分组1,后续连续两次匹配和分组1完全相同的字符,刚好构成连续三个相同字母的检测逻辑。如果只需要匹配小写字母,只需要把字符范围调整为[a-z]即可。 - 实现代码:
import re # 预编译正则规则,多次调用时无需重复编译,大幅提升执行效率 THREE_SAME_LETTER_PATTERN = re.compile(r'([a-zA-Z])\1\1') def has_three_consecutive_letters(target_str: str) -> bool: # search 方法匹配到第一个符合规则的内容就停止扫描,无需遍历完整字符串 return bool(THREE_SAME_LETTER_PATTERN.search(target_str))
- 规则调整成本极低:如果后续要修改检测要求,比如检测连续4个相同字母,只需要把正则中的
\1\1改成\1\1\1即可,不需要改动大量硬编码内容。
2. 纯内置语法实现(零依赖)
核心逻辑是用Python内置的any()函数配合逐位切片判断,不需要引入任何外部模块,代码语义直白,没有正则学习成本。
- 实现代码:
def has_three_consecutive_letters(target_str: str) -> bool: # 遍历所有连续三字符的起始位置,判断是否为相同字母 return any( target_str[i] == target_str[i+1] == target_str[i+2] and target_str[i].isalpha() for i in range(len(target_str) - 2) )
- 边界自动处理:当字符串长度小于3时,
range(len(target_str)-2)会自动生成空序列,any()直接返回False,不需要额外编写边界判断逻辑。
样例验证
使用提供的三个典型检测样例调用上述实现,均可正确返回True,符合预期:
string1 = 'this is oooonly excaple' string2 = 'nooo way that he did this' string3 = 'I kneeeeeew it!' print(has_three_consecutive_letters(string1)) # 输出 True print(has_three_consecutive_letters(string2)) # 输出 True print(has_three_consecutive_letters(string3)) # 输出 True
内容的提问来源于stack exchange,提问作者taga
相关产品推荐
相关产品推荐

