如何通过字典替换Python字符串?正则替换后eval报错求助
解决Python字符串替换中的语法错误问题
我来帮你分析下问题所在,以及对应的解决方案:
错误原因拆解
你遇到的语法错误主要有两个核心问题:
- 正则表达式匹配范围不足:原正则
\b(\w+)\b里的\w只能匹配字母、数字和下划线,无法匹配像ABC-3K这种带连字符的键。这会导致ABC-3K被拆成ABC和3K两个独立部分,都匹配不到你的字典键,替换后还是ABC-3K,而eval会把ABC-3K当成Python表达式解析——ABC和3K会被视为未定义的变量,减号被当作减法运算符,直接触发语法错误。 - 不必要的
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,提问作者이춘경
相关产品推荐
相关产品推荐

