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

利用RegEx优化PDF提取文本格式,解决pyttsx3朗读长停顿问题

解决PDF提取文本朗读时换行停顿问题的正则方案

针对你用pdfminer.six提取文本后,pyttsx3在换行处产生不必要长停顿的问题,以下是两种符合需求的正则处理方案,均保留段落结构:


方案1:单段落合并为连续文本

目标:将段落内的所有换行替换为空格,仅保留段落之间的空行分隔,让整个段落成为连续的朗读内容。

实现代码

import re

# 替换段落内的单个换行(非段落分隔的换行)为空格
def merge_paragraph_to_single_block(text):
    # 匹配:前面不是换行、后面也不是换行的单个\n
    return re.sub(r'(?<!\n)\n(?!\n)', ' ', text)

# 示例用法
extracted_pdf_text = """这是第一段第一行
这是第一段第二行,未到句尾。
这是第一段第三行。

这是第二段第一行
这是第二段第二行。"""

processed_text = merge_paragraph_to_single_block(extracted_pdf_text)
print(processed_text)

处理后效果

这是第一段第一行 这是第一段第二行,未到句尾。 这是第一段第三行。

这是第二段第一行 这是第二段第二行。

朗读时仅在段落间、句末停顿,不会因段落内换行产生长停顿。


方案2:按分句拆分(保留段落)

目标:仅保留分句(以。!?结尾)后的停顿逻辑,将非分句结尾的换行合并,同时让每个分句独立,保证朗读停顿自然。

实现代码

import re

def split_by_sentence(text):
    # 第一步:合并非分句结尾的段落内换行
    merged_non_sentence = re.sub(r'(?<![。!?])\n(?!\n)', ' ', text)
    # 第二步:将分句结尾标记后添加换行,让每个分句独立(可选,方便朗读停顿)
    split_text = re.sub(r'(。|!|?)(?=\s|$)', r'\1\n', merged_non_sentence)
    return split_text

# 示例用法
processed_text = split_by_sentence(extracted_pdf_text)
print(processed_text)

处理后效果

这是第一段第一行 这是第一段第二行,未到句尾。
这是第一段第三行。

这是第二段第一行 这是第二段第二行。

朗读时仅在分句结尾和段落间停顿,完全避免原换行导致的不当长停顿。


补充调整说明

如果你的PDF文本段落分隔不是\n\n,而是带空格的换行(比如\n \n),可以把正则中的(?!\n)替换为(?!\s*\n),兼容空白字符的情况。

内容的提问来源于stack exchange,提问作者KNU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:13