利用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
相关产品推荐
相关产品推荐

