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

Django自定义过滤器迭代处理文本时仅匹配首个双下划线包裹内容问题

双下划线包裹文本匹配不全问题排查修复方案

排查方向

  • 正则使用错误排查

    • 不要使用re.match()做匹配,该方法仅匹配字符串开头位置的内容,全局匹配请使用re.findall()或者re.sub()
    • 检查匹配规则是否为非贪婪模式,正确的双下划线匹配规则为r"__(.*?)__",缺少?的贪婪模式会从第一个__匹配到最后一个__,导致中间所有内容被合并成一个匹配结果
    • 检查re.sub()方法是否额外指定了count=1参数,该参数会限制仅替换第一个匹配项,删除该参数即可默认全局替换所有匹配结果
  • 业务逻辑错误排查

    • 若使用手动遍历匹配结果做替换,需注意每次替换后字符串长度会发生变化,不能复用原始字符串的索引定位后续匹配项,建议优先使用re.sub()直接完成批量替换,避免手动处理索引偏移问题
    • 检查处理逻辑中是否存在提前终止循环的break、return语句,或者异常捕获后未继续处理剩余内容的逻辑

参考实现代码

全局格式化替换示例

import re

# 示例输入内容
raw_content = "用户输入的__第一段目标文本__和__第二段目标文本__以及__第三段__"
# 将双下划线包裹的内容替换为<em>标签(可替换为你需要的任意格式)
processed_content = re.sub(r"__(.*?)__", r"<em>\1</em>", raw_content)
print(processed_content)
# 输出结果:用户输入的<em>第一段目标文本</em>和<em>第二段目标文本</em>以及<em>第三段</em>

提取所有双下划线包裹内容示例

import re

raw_content = "用户输入的__第一段目标文本__和__第二段目标文本__以及__第三段__"
target_list = re.findall(r"__(.*?)__", raw_content)
print(target_list)
# 输出结果:['第一段目标文本', '第二段目标文本', '第三段']

兼容优化建议

如果存在用户输入全角双下划线__的场景,可以调整正则规则兼容全半角格式:
r"__(.*?)__|__(.*?)__"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:15:08