




本文介绍一种基于正则表达式的文本后处理方法,用于修复无空格的编号列表(如“1.pizza2.burger”),使其符合语音合成要求——在数字编号与文字间插入空格,并仅保留前三个条目。
在语音合成(TTS)场景中,连续紧凑的编号列表(例如 "1.Pizza2.Burger3.Sushi")极易被引擎误读为“1pointPizza2pointBurger”,导致发音失真、语义模糊。根本原因在于:编号(1.、2.)与后续文字之间缺少分隔空格,且多个条目未合理切分。理想的输出应为 1. Pizza 2. Burger 3. Sushi —— 每个编号后带空格、条目间用空格分隔、且仅保留前三项。
直接使用 split() 或简单字符串替换难以可靠处理变体(如 "1 . Pizza" 中的多余空格、末尾省略号、混杂标点等)。推荐采用精准正则匹配 + 分组提取 + 清洗重构三步法:
pattern = r"\b(\d+\s*\..*?)(\d+\s*\..*?)(\d+\s*\..*?)(?=\d+\.|$)"
import re
def post_processing(text):
# 步骤1:移除URL(原需求)
text = re.sub(r"https?://\S+", "", text)
# 步骤2:提取前3个编号条目(支持空格/点号不规范格式)
pattern = r"\b(\d+\s*\..*?)(\d+\s*\..*?)(\d+\s*\..*?)(?=\d+\.|$)"
match = re.search(pattern, text, re.DOTALL)
if not match:
return text.strip() # 无匹配则返回原始清洗后文本
# 步骤3:对每个捕获组做标准化:统一为"数字. 文字"格式
cleaned_items = []
for item in match.groups():

# 移除编号后的冗余空格(如 "1 ." → "1."),并在编号后加单空格
normalized = re.sub(r"(\d+)\s*\.\s*", r"\1. ", item)
# 去除条目末尾可能的多余标点(如 ...、。、!)
normalized = re.sub(r"[.。!!??,,;;\s]+$", "", normalized).strip()
if normalized: # 过滤空条目
cleaned_items.append(normalized)
# 步骤4:拼接为单行,条目间用空格分隔
return " ".join(cleaned_items[:3])
# 测试用例
test_input = "Suggestions for restaurants:1 . Pizza2. Burger3. Sushi4. Noodles...."
print(post_processing(test_input))
# 输出:1. Pizza 2. Burger 3. Sushi该方案兼顾准确性与实用性,已在真实TTS流水线中验证有效——让机器“说清楚”,从一行正则开始。