必须在dify自定义节点中嵌入可调试、分组、支持贪婪控制的正则表达式提取敏感字段;需用regex101验证python语法,避开\k等不支持特性;按提取数量分路径处理,并通过webhook推送带x-sensitive-extracted标识的审计事件;llm输入须替换为正则脱敏后的masked_content。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify工作流中精准提取身份证号、手机号、银行卡号等敏感字段,必须绕过平台默认的简单匹配逻辑,直接在自定义节点中嵌入可调试、可分组、支持贪婪/非贪婪控制的正则表达式——这一步不能依赖内置文本提取工具。
准备正则表达式并验证语法有效性
打开在线正则测试工具(如 regex101.com),将目标文本粘贴进去,选择 Python flavor;输入类似 r'\b\d{17}[\dXx]\b' 提取身份证号,或 r'1[3-9]\d{9}' 匹配大陆手机号;确认右侧“Match information”面板显示完整捕获组且无 【Unmatched parentheses 或 Invalid escape】 报错。
注意:Dify 自定义节点运行环境为 Python 3.11+,不支持 \K 重置匹配起点,也不支持 (? 变长逆序环视——若你写了这类表达式,运行时会直接抛出 <code>error: look-behind requires fixed-width pattern。
在Dify自定义节点中注入正则逻辑
进入工作流编辑页 → 添加“Custom Tool”节点 → 点击“Edit Code” → 替换默认模板为以下结构:
import re
def main(input_data):
text = input_data.get("content", "")
# 提取所有18位身份证号(含末位X)
id_pattern = r'\b\d{17}[\dXx]\b'
ids = re.findall(id_pattern, text)
# 提取带区号的固话(如 021-12345678 或 0755 87654321)
tel_pattern = r'(?:0\d{2,3}[-\s]?)\d{7,8}'
tels = re.findall(tel_pattern, text)
return {"ids": list(set(ids)), "phones": list(set(tels))}
这段代码使用 re.findall 而非 re.search,确保提取全部命中项而非仅第一个;list(set(...)) 去重防止重复敏感信息被多次触发告警。
配置多级敏感词提取与上下文关联
第一步:在 Custom Tool 节点中启用“Allow multiple outputs”,否则返回的 dict 会被强制扁平化为单个字符串,丢失结构。
第二步:添加 Condition Node,设置表达式为 {{#tool_result.ids.length}} > 0,分支走“高危路径”;另一分支设为 {{#tool_result.phones.length}} > 3,走“中风险路径”。
第三步:在高危路径后接“Webhook”节点,向内部审计系统推送原始文本 + 提取结果,请求头中必须携带 【X-Sensitive-Extracted: true】 标识,否则接收方会丢弃该事件。
第四步:将原始文本传入 LLM 节点时,用 {{#input.content}} 替换为 {{#tool_result.masked_content}} —— 这个字段需在 Custom Tool 中手动构造,例如:"masked_content": re.sub(id_pattern, "[ID_HIDDEN]", text),否则模型仍可能输出原始身份证号。











