You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)这一行。

原因分析

  1. 变量名冲突:外层循环和内层循环均使用变量i,会覆盖外层的行变量,在部分边缘场景下可能导致该行的句号未被正确处理。
  2. 正则匹配逻辑缺陷:你的正则表达式[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:58