Python中使用句号作为多分隔符进行字符串分割时生成空字符串的问题咨询
这个问题我之前也踩过坑!核心是你的正则分割规则不一致,导致分割后出现了讨厌的空字符串,我来给你拆解清楚并提供几种靠谱的解决方案:
问题原因分析
你的正则表达式' |\\, |\\; |\\? |\\.'存在两个关键问题:
- 分隔符规则不统一:像
,、;、?都是「标点+空格」的组合,但.却是单独的标点符号; - 分割逻辑产生空串:当遇到
Hello. my这种场景时,re.split会先按.分割出Hello和my,接着又按空格分割my——开头的空格会被识别成分隔符,从而凭空生出空字符串''。
解决方案
方法1:用re.findall直接提取单词(推荐)
比起费劲分割不需要的分隔符,直接提取你需要的单词会更简单直观,完全从根源避免空字符串问题:
import re def convert_to_word_list(text): # 匹配所有由大小写字母组成的单词,兼容各种标点分隔场景 word_list = re.findall(r'[A-Za-z]+', text) return [word.lower() for word in word_list] print(convert_to_word_list("Hello. my; name, is? Mad Max"))
输出结果:
['hello', 'my', 'name', 'is', 'mad', 'max']
方法2:调整正则分割规则并过滤空串
如果你坚持用re.split,可以统一分隔符规则,同时过滤掉分割后可能产生的空字符串:
import re def convert_to_word_list(text): # 匹配规则:要么是「标点(.,;?)+ 任意数量空格」,要么是「任意数量空格」 word_list = re.split(r'[.,;?]\s*|\s+', text) # 过滤空字符串(处理文本首尾可能出现的分隔符情况) word_list = [word for word in word_list if word] return [word.lower() for word in word_list] print(convert_to_word_list("Hello. my; name, is? Mad Max"))
这个正则能覆盖所有标点带空格、不带空格的场景,分割后不会产生多余空串,最后再过滤一遍确保万无一失。
方法3:修复原正则的分隔符规则(局限性较强)
把.也改成. (标点+空格)的形式,同时过滤空串,但这种方法仅适用于标点后带空格的场景,如果遇到Hello.world(标点后无空格)就会失效:
import re def convert_to_word_list(text): word_list = re.split(r' |\, |\; |\? |\. ', text) word_list = [word for word in word_list if word] return [word.lower() for word in word_list]
内容的提问来源于stack exchange,提问作者Cecil Shepherd
相关产品推荐
相关产品推荐

