From 08c1d73f7774f76e3c11b509e58d187ce90efa40 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:28:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor(chat):=E7=AE=80=E5=8C=96=E5=92=8C?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E5=9B=9E=E5=A4=8D=E6=A0=BC=E5=BC=8F=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前用于过滤 `[回复...]` 格式的实现依赖于多个正则表达式。这种方法比较复杂,并且无法正确处理深度嵌套的回复字符串。 此提交重构了逻辑,采用更简单、更稳健的基于字符串的方法。通过在以 `[回复` 开头的字符串中找到最后一个闭合括号 `]`,新逻辑可以可靠地去除整个回复前缀,无论嵌套深度如何。这提高了解析的准确性,并简化了代码。 --- src/chat/utils/utils.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 97874b714..38205477e 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -930,12 +930,11 @@ def filter_system_format_content(content: str | None) -> str: 过滤系统格式化内容,移除回复、@、图片、表情包等系统生成的格式文本 此方法过滤以下类型的系统格式化内容: - 1. 回复格式:[回复xxx],说:xxx + 1. 回复格式:[回复xxx],说:xxx (包括深度嵌套) 2. 表情包格式:[表情包:xxx] 3. 图片格式:[图片:xxx] 4. @格式:@ 5. 错误格式:[表情包(...)]、[图片(...)] - 6. [回复开头的格式 Args: content: 原始内容 @@ -949,29 +948,20 @@ def filter_system_format_content(content: str | None) -> str: original_content = content cleaned_content = content.strip() - # 1. 移除回复格式:[回复xxx],说:xxx(各种变体) - # 匹配所有包含"],说:"格式的回复 - cleaned_content = re.sub(r"\[回复[^\]]*\],说:\s*", "", cleaned_content) - # 匹配 [回复],说:xxx 格式 - cleaned_content = re.sub(r"\[回复<[^>]*>\],说:\s*", "", cleaned_content) - - # 2. 处理原有的[回复开头格式(保持向后兼容) - # 注意:这步要在上面处理完成后再执行,避免冲突 + # 核心逻辑:优先处理最复杂的[回复...]格式,特别是嵌套格式。 + # 这种方法最稳健:如果以[回复开头,就找到最后一个],然后切掉之前的所有内容。 if cleaned_content.startswith("[回复"): last_bracket_index = cleaned_content.rfind("]") if last_bracket_index != -1: cleaned_content = cleaned_content[last_bracket_index + 1 :].strip() - # 3. 移除表情包格式:[表情包:xxx] + # 在处理完回复格式后,再清理其他简单的格式 + # 移除表情包格式:[表情包:xxx] cleaned_content = re.sub(r"\[表情包:[^\]]*\]", "", cleaned_content) - - # 4. 移除图片格式:[图片:xxx] + # 移除图片格式:[图片:xxx] cleaned_content = re.sub(r"\[图片:[^\]]*\]", "", cleaned_content) - - # 5. 移除@格式:@ + # 移除@格式:@ cleaned_content = re.sub(r"@<[^>]*>", "", cleaned_content) - - # 6. 移除其他可能的系统格式 # [表情包(描述生成失败)] 等错误格式 cleaned_content = re.sub(r"\[表情包\([^)]*\)\]", "", cleaned_content) # [图片(描述生成失败)] 等错误格式