使用re.findall处理德语文本时部分句号丢失的问题咨询
德语文本处理中部分句号丢失的问题分析与解决
问题背景
我有一个预处理后的德语文本文件,所有39行末尾均带有句号。为去除文本中的空值,我使用了以下代码:
text_with_nulls = open('lemmatizeAFD', 'r') text_without_nulls = open('lemmatizeAFD_without_nulls', 'w') for i in text_with_nulls: res = re.findall(r'[a-zA-Z0-9äöüÄÖÜß\.]+', i) for i in res: text_without_nulls.write(i) text_without_nulls.write(' ')
然而输出文件中仅保留了33个句号,所有词形还原后的单词均正常存在。我需要用这些句号将句子拆分到单独行中,推测问题出在正则表达式res = re.findall(r'[a-zA-Z0-9äöüÄÖÜß\.]+', i)这一行。
原因分析
- 变量名冲突:外层循环和内层循环均使用变量
i,会覆盖外层的行变量,在部分边缘场景下可能导致该行的句号未被正确处理。 - 正则匹配逻辑缺陷:你的正则表达式
[a-zA-Z0-9äöüÄÖÜß\.]+是匹配连续的合法字符序列。如果某行的句号与周围字符无法组成连续匹配序列(比如句号前有不在字符集内的特殊符号,或句号单独存在但被其他不可见字符干扰),就可能出现匹配遗漏;另外,当句号和单词连在一起时(如abc.),会被作为一个整体匹配,虽然句号不会丢失,但会破坏后续拆分句子的结构。
解决方法
方法一:直接清理空值,保留原文本结构
如果你的“空值”指的是文件中的空字节(\x00)或多余空白,直接替换清理即可,无需破坏原有的句号位置:
import re # 使用with语句自动管理文件关闭,指定编码避免乱码 with open('lemmatizeAFD', 'r', encoding='utf-8') as input_file: with open('lemmatizeAFD_without_nulls', 'w', encoding='utf-8') as output_file: for line in input_file: # 去除空字节 cleaned_line = line.replace('\x00', '') # 可选:去除多余空白字符,保留单个空格 cleaned_line = re.sub(r'\s+', ' ', cleaned_line).strip() + '\n' output_file.write(cleaned_line)
方法二:调整正则表达式,修复变量名
如果必须使用re.findall提取内容,可拆分单词与句号的匹配逻辑,同时修复变量名冲突:
import re with open('lemmatizeAFD', 'r', encoding='utf-8') as input_file: with open('lemmatizeAFD_without_nulls', 'w', encoding='utf-8') as output_file: for line in input_file: # 分别匹配单词和句号,确保每个句号都被提取 matches = re.findall(r'[a-zA-Z0-9äöüÄÖÜß]+|\.', line) for item in matches: output_file.write(item) output_file.write(' ') # 保留行结构,添加换行 output_file.write('\n')
内容的提问来源于stack exchange,提问作者Mikhail Rotar
相关产品推荐
相关产品推荐

