Python如何不使用正则 通过while循环提取字符串纯字母单词
问题背景
- 需求:不使用正则表达式,仅通过
while循环实现字符串解析:通过input()接收用户输入的字符串,将句子中仅由字母构成的单词提取到列表中,标点、括号等特殊字符不属于单词组成部分。 - 测试样例
输入字符串:
The weather is so lovely today. Jack (our Jack) – Jason - and Alex went to park..?
给出的期望输出:["The", "weather", "is", "so","lovely","today","Jack","our","Jack","and","Alex","went","to","park"]
注:输入中实际存在单词Jason,上述给出的期望输出存在遗漏。
原有代码错误排查
第一段代码问题
- 循环嵌套逻辑错误:跳过非字母、匹配字母的逻辑被错误嵌套,每次修改字符串
s后索引j未重置,直接导致索引越界、截取位置错乱 - 变量逻辑混乱:
l和s反复互相赋值截取,完全丢失遍历进度,无法按顺序提取单词 - 结果写入时机错误:
k.append(l[0:i])放在所有循环结束后仅执行1次,且i全程为初始值0,无法存入有效单词 - 存在无限循环风险:如果字符串截取逻辑出错,
while s判断条件永远为真,程序会直接卡死
第二段代码问题
- 缺少外层遍历循环:整段匹配逻辑仅执行1轮,只能提取到第一个符合要求的单词,后续内容完全不会处理
- 索引未重置:提取完第一个单词后
i、j索引值没有归零,即使补充外层循环也会出现索引错位 - 字符串截取逻辑错误:每次移动索引就修改
s的值,会导致剩余字符串长度和索引值不匹配,截取内容完全错误
正确实现方案
实现思路
全程使用单个索引指针遍历原字符串,不反复截取修改原字符串,从根源避免索引错位:
- 循环跳过当前位置所有连续的非字母字符,直到碰到字母或遍历到字符串末尾
- 如果已经遍历到字符串末尾,直接结束流程
- 记录当前连续字母段的起始位置,继续循环遍历完所有连续的字母,碰到非字母时停止,将这段字母切片存入结果列表
- 重复上述步骤,直到遍历完整个字符串
可运行代码
# 接收用户输入,测试时可直接替换为固定字符串 s = input("请输入待解析的字符串:") # s = " The weather is so lovely today. Jack (our Jack) – Jason - and Alex went to park..?" result = [] str_length = len(s) index = 0 while index < str_length: # 跳过所有非字母字符 while index < str_length and not s[index].isalpha(): index += 1 # 遍历到字符串末尾直接退出 if index >= str_length: break # 记录单词起始位置 word_start = index # 遍历完当前连续的所有字母 while index < str_length and s[index].isalpha(): index += 1 # 截取单词加入结果列表 result.append(s[word_start:index]) print(result)
运行示例输入时,代码会输出['The', 'weather', 'is', 'so', 'lovely', 'today', 'Jack', 'our', 'Jack', 'Jason', 'and', 'Alex', 'went', 'to', 'park'],正确提取所有由纯字母构成的单词,自动过滤所有特殊符号。
内容的提问来源于stack exchange,提问作者samwolf
相关产品推荐
相关产品推荐

