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

如何通过字典替换Python字符串?正则替换后eval报错求助

解决Python字符串替换中的语法错误问题

我来帮你分析下问题所在,以及对应的解决方案:

错误原因拆解

你遇到的语法错误主要有两个核心问题:

  1. 正则表达式匹配范围不足:原正则\b(\w+)\b里的\w只能匹配字母、数字和下划线,无法匹配像ABC-3K这种带连字符的键。这会导致ABC-3K被拆成ABC和3K两个独立部分,都匹配不到你的字典键,替换后还是ABC-3K,而eval会把ABC-3K当成Python表达式解析——ABC和3K会被视为未定义的变量,减号被当作减法运算符,直接触发语法错误。
  2. 不必要的eval使用:eval会把字符串当作Python代码执行,这不仅有安全风险,而且在你的场景里完全没必要。你想要的是替换后的字符串输出,直接用re.sub的结果就可以,不需要额外执行代码。

修正后的解决方案

方案1:直接输出替换后的字符串(最推荐)

调整正则表达式以支持带连字符的键,同时移除eval:

import re

nodeDic = {"ABC-3K": "True", "TTR": "True"}
address = "ABC-3K and TTR"
# 修改正则为[\w-]+,匹配包含字母、数字、下划线和连字符的键
result = re.sub(r"\b([\w-]+)\b", lambda m: nodeDic.get(m.group(1), m.group(1)), address)
print(result)

运行后会直接输出:True and True,完全符合你的预期。

方案2:如果需要转换为布尔值(而非字符串)

如果你的目标是得到布尔值的组合输出,可以把字典里的值直接设为布尔类型,再处理:

import re

nodeDic = {"ABC-3K": True, "TTR": True}
address = "ABC-3K and TTR"
# 按分隔符拆分字符串,逐个匹配字典值
parts = address.split(" and ")
result_parts = [nodeDic.get(part, part) for part in parts]
# 拼接成预期格式
result = " and ".join(str(part) for part in result_parts)
print(result)

这个方案会输出同样的True and True,但字典里存储的是原生布尔值,更符合Python的类型规范。

额外提醒

  • 尽量避免使用eval,尤其是处理不可信的输入时,可能导致代码注入风险。
  • 如果你的键还有其他特殊字符(比如点号、斜杠),需要进一步调整正则表达式的匹配范围,确保能覆盖所有键的格式。

内容的提问来源于stack exchange,提问作者이춘경

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:25:07