Python文本分词时开头出现空字符串的原因与解决方法
为什么使用
re.split(r'\W+', text)分割文本会得到开头的空字符串? 我在预处理文本文件数据时,尝试将文本文件分割为单词,使用了以下Python代码:
import io f = io.open("pg5200.txt", mode="r", encoding="utf-8") text = f.read() f.close() import re words = re.split(r'\W+', text) print(words[:100])
运行上述代码后,发现结果开头出现了一个空字符串(""),想了解该问题产生的原因以及如何解决?
问题原因
这是正则分割的典型场景问题,核心在于re.split的工作逻辑:\W+会匹配一个或多个非单词字符(包括空格、换行、标点符号等)。如果你的pg5200.txt文件开头就是这类非单词字符(比如文件开头有空白换行、书名号、括号之类的标点),split会在这些分隔符位置切割——而分隔符前面没有任何有效内容,自然就会生成一个空字符串作为结果的第一个元素。
举个简化的例子:如果文本是" Hello world!",用re.split(r'\W+', text)分割后,开头的两个空格会被匹配,空格前无内容,结果就会是['', 'Hello', 'world']。
解决办法
这里有几种实用的解决方案,你可以根据需求选择:
1. 先清理文本开头的非单词字符再分割
用正则直接去掉文本开头的所有非单词字符,从源头上避免空字符串产生:
import io import re with io.open("pg5200.txt", mode="r", encoding="utf-8") as f: text = f.read() # 移除开头的所有非单词字符 cleaned_text = re.sub(r'^\W+', '', text) words = re.split(r'\W+', cleaned_text) print(words[:100])
如果只是开头有空白字符,也可以用text.strip()先去除首尾空白,但正则方式能处理标点等更多场景,适用性更强。
2. 过滤分割结果中的空字符串
直接对分割后的列表做过滤,把空字符串全部剔除:
import io import re with io.open("pg5200.txt", mode="r", encoding="utf-8") as f: text = f.read() words = re.split(r'\W+', text) # 过滤掉所有空字符串 words = [word for word in words if word] print(words[:100])
3. 使用re.findall()直接提取单词(最推荐)
与其分割文本,不如直接用正则提取所有连续的单词字符序列,从根源上避免空字符串问题:
import io import re with io.open("pg5200.txt", mode="r", encoding="utf-8") as f: text = f.read() # 直接提取所有单词,不会产生空字符串 words = re.findall(r'\w+', text) print(words[:100])
re.findall(r'\w+', text)会匹配所有连续的字母、数字、下划线序列,返回的列表里只会有有效单词,完全不会混入空字符串。
内容的提问来源于stack exchange,提问作者Siddhant
相关产品推荐
相关产品推荐

