
本文介绍一种基于正则表达式的文本后处理方法,用于修复无空格分隔的编号列表(如“1.pizza2.burger”),自动在数字编号与后续文字间插入空格,并严格限制输出为前三个条目,显著提升语音合成的自然度和可理解性。
在语音合成(TTS)场景中,未经格式化的编号列表常导致发音错误——例如 "1.Pizza2.Burger" 会被 TTS 引擎识别为连续单词 "1Pizza2Burger",而非独立语义单元。根本原因在于编号(如 1.、2.)与后续文字之间缺少必要空格,且原始文本可能存在多余空白(如 1 . Pizza)或无分隔符粘连(如 2.Burger)。理想的修复效果应满足三点:
- ✅ 在每个编号后统一规范为 N. 格式(数字、英文点、单空格、文字);
- ✅ 仅保留前三个有效条目;
- ✅ 彻底移除 URL 等干扰内容,确保输出简洁。
以下是一个鲁棒性强、逻辑清晰的 Python 实现方案:
import re
def post_processing(text):
"""
针对语音合成优化的列表后处理函数:
- 提取前3个编号项(支持不规则空格,如 "1 . Pizza")
- 标准化编号格式(统一为 "N. 内容",去除编号内冗余空格)
- 合并为单行字符串,项间以单空格分隔
- 清理 URL 及首尾空白
"""
# 步骤1:移除所有 URL(防止干扰匹配)
text = re.sub(r"https?://\S+", "", text)
# 步骤2:使用正则提取前3个编号项(支持 \d+\s*\.\s* 开头的片段)
# 模式说明:
# \b → 单词边界,避免匹配到 "10.abc" 中的 "1."
# (\d+\s*\.) → 编号部分:1+数字 + 任意空白 + 英文点(捕获组1)
# ([^.\n]*?) → 内容部分:非点/换行字符的最短匹配(捕获组2)
# (?=\d+\.|$) → 向前查找:下一项以数字+点开头,或已到字符串末尾
pattern = r"\b(\d+\s*\.)\s*([^.\n]*?)(?=\s*\d+\.|\s*$)"
matches = re.findall(pattern, text, re.DOTALL)
# 步骤3:取前3项,标准化格式(清理编号内空格,补足空格)
processed_items = []
for i, (num_part, content) in enumerate(matches[:3]):
# 清理编号:如 "1 ." → "1."
clean_num = re.sub(r"\s+", "", num_part) # 移除编号内所有空白
# 清理内容:去首尾空,删可能残留的标点(如结尾多个点)
clean_content = content.strip().rstrip(".")
# 组合成标准项:"1. Pizza"
item = f"{clean_num} {clean_content}" if clean_content else clean_num
processed_items.append(item)
# 步骤4:用单空格连接所有项,并全局清理多余空格
result = " ".join(processed_items)
result = re.sub(r"\s+", " ", result).strip()
return result
# 测试示例
text = "Suggestions for restaurants:1 . Pizza2. Burger3. Sushi4. Noodles... https://example.com"
print(post_processing(text))
# 输出:1. Pizza 2. Burger 3. Sushi关键设计说明:
- 更健壮的匹配逻辑:相比原答案中依赖固定三组捕获的正则,本方案采用 re.findall() 配合非贪婪匹配 [^.\n]*?,能准确切分任意长度的粘连列表(包括 1.Pizza2.Burger 或 1 . Pizza2. Burger),不受中间空格数量影响;
- 精准截断控制:matches[:3] 显式限制仅处理前三个匹配项,避免因正则贪婪性导致遗漏或越界;
- 防御性清洗:re.sub(r"\s+", " ", result) 确保最终输出无多余空格,rstrip(".") 防止内容末尾残留省略号干扰发音;
- URL 预处理前置:在正则匹配前移除 URL,避免其干扰编号模式识别(如 https://site.com/1.abc 中的 1. 被误捕)。
注意事项:
⚠️ 若输入中编号非连续(如跳过 2. 直接出现 3.),本方案仍按实际匹配顺序取前3个,符合“前三个建议”的业务需求;
⚠️ 对于中文编号(如 一、、①)或字母编号(a.),需扩展正则模式,当前方案专为阿拉伯数字编号(\d+.)优化;
⚠️ 若原始文本不含任何编号项,函数将返回空字符串,建议调用方增加空值判断逻辑。
通过该方案,开发者可一键解决 TTS 场景中最常见的列表发音失真问题,在保持代码简洁的同时,兼顾准确性、可维护性与语音友好性。










