
本文介绍如何利用 Python 的 re.sub() 配合自定义替换函数,精准匹配形如 或 的锚点标记,并依据字典进行安全替换,跳过未定义键,保留原始标记。
本文介绍如何利用 python 的 `re.sub()` 配合自定义替换函数,精准匹配形如 `` 或 `` 的锚点标记,并依据字典进行安全替换,跳过未定义键,保留原始标记。
在模板渲染、配置插值或轻量级标记解析等场景中,常需将形如 、 这类带锚点(anchor)的占位符替换为实际值,且仅当格式严格匹配时才生效——例如不能误替换文本中孤立出现的 one 或 。此时,简单地遍历字典做 <code>.replace() 无法满足锚点校验需求,而通用多替换方案(如按长度降序替换)也无法识别结构化边界。
正确做法是使用正则表达式精确捕获锚点结构,并通过回调函数动态查表替换。核心模式为:
r""
其中:
和 <code>>是字面量锚点边界;-
(\w+)捕获内部关键字(如one、two),作为字典查找的键; -
\|?表示可选的竖线|(?表示前一字符出现 0 或 1 次),从而同时兼容和两种常见写法。
替换逻辑封装在闭包函数中,确保对每个匹配项单独查字典,并对缺失键优雅降级(返回原标记,避免静默失败):
import re
d = {'one': '1', 'two': '2', 'three': '3'}
def replace_items(text):
pattern = r""
def replacement(match):
key = match.group(1)
return d.get(key, match.group(0)) # 查字典;未命中则保留原标记
return re.sub(pattern, replacement, text)
# 测试用例
s1 = 'String containing or numbers. , , '
s2 = 'Only replace items which are anchored. is replaced, but not this one.'
s3 = 'Number is not in the dictionary'
print(replace_items(s1))
# → String containing 1 or 2 numbers. 1, 2, 3
print(replace_items(s2))
# → Only replace items which are anchored. 1 is replaced, but not this one.
print(replace_items(s3))
# → Number is not in the dictionary
关键注意事项:
- 正则中的
\w+仅匹配字母、数字和下划线,若键名含连字符(如user-id)或点号,需改用[^>|]+等更宽松模式; - 字典查找使用
.get(key, default)而非d[key],避免KeyError,提升鲁棒性; - 若需支持嵌套或转义(如
),应升级为更复杂的解析器,而非单纯正则; - 性能敏感场景下,可预编译正则对象(
re.compile(pattern))复用,避免重复编译开销。
该方案以单次正则扫描完成全部锚点匹配与字典映射,兼具准确性、可读性与可维护性,是处理结构化占位符替换的推荐实践。











